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 |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 EXPECT_EQ(0, test::NumHistogramSamples("WebRTC.Video.InputWidthInPixels")); | 327 EXPECT_EQ(0, test::NumHistogramSamples("WebRTC.Video.InputWidthInPixels")); |
328 | 328 |
329 // Switch to screenshare, real-time stats should be updated. | 329 // Switch to screenshare, real-time stats should be updated. |
330 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); | 330 statistics_proxy_->SetContentType(VideoEncoderConfig::ContentType::kScreen); |
331 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.InputWidthInPixels")); | 331 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.InputWidthInPixels")); |
332 } | 332 } |
333 | 333 |
334 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8) { | 334 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8) { |
335 test::ClearHistograms(); | 335 test::ClearHistograms(); |
336 EncodedImage encoded_image; | 336 EncodedImage encoded_image; |
337 CodecSpecificInfo codec_info; | 337 RTPVideoHeader rtp_video_header; |
338 codec_info.codecType = kVideoCodecVP8; | 338 rtp_video_header.codec = kRtpVideoVp8; |
339 | 339 |
340 for (int i = 0; i < kMinRequiredSamples; ++i) { | 340 for (int i = 0; i < kMinRequiredSamples; ++i) { |
341 codec_info.codecSpecific.VP8.simulcastIdx = 0; | 341 rtp_video_header.simulcastIdx = 0; |
342 encoded_image.qp_ = kQpIdx0; | 342 encoded_image.qp_ = kQpIdx0; |
343 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 343 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
344 codec_info.codecSpecific.VP8.simulcastIdx = 1; | 344 rtp_video_header.simulcastIdx = 1; |
345 encoded_image.qp_ = kQpIdx1; | 345 encoded_image.qp_ = kQpIdx1; |
346 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 346 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
347 } | 347 } |
348 statistics_proxy_.reset(); | 348 statistics_proxy_.reset(); |
349 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8.S0")); | 349 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8.S0")); |
350 EXPECT_EQ(kQpIdx0, | 350 EXPECT_EQ(kQpIdx0, |
351 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8.S0")); | 351 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8.S0")); |
352 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8.S1")); | 352 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8.S1")); |
353 EXPECT_EQ(kQpIdx1, | 353 EXPECT_EQ(kQpIdx1, |
354 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8.S1")); | 354 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8.S1")); |
355 } | 355 } |
356 | 356 |
357 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8OneSsrc) { | 357 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8OneSsrc) { |
358 VideoSendStream::Config config(nullptr); | 358 VideoSendStream::Config config(nullptr); |
359 config.rtp.ssrcs.push_back(kFirstSsrc); | 359 config.rtp.ssrcs.push_back(kFirstSsrc); |
360 statistics_proxy_.reset(new SendStatisticsProxy( | 360 statistics_proxy_.reset(new SendStatisticsProxy( |
361 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); | 361 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); |
362 | 362 |
363 test::ClearHistograms(); | 363 test::ClearHistograms(); |
364 EncodedImage encoded_image; | 364 EncodedImage encoded_image; |
365 CodecSpecificInfo codec_info; | 365 RTPVideoHeader rtp_video_header; |
366 codec_info.codecType = kVideoCodecVP8; | 366 rtp_video_header.codec = kRtpVideoVp8; |
367 | 367 |
368 for (int i = 0; i < kMinRequiredSamples; ++i) { | 368 for (int i = 0; i < kMinRequiredSamples; ++i) { |
369 codec_info.codecSpecific.VP8.simulcastIdx = 0; | 369 rtp_video_header.simulcastIdx = 0; |
370 encoded_image.qp_ = kQpIdx0; | 370 encoded_image.qp_ = kQpIdx0; |
371 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 371 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
372 } | 372 } |
373 statistics_proxy_.reset(); | 373 statistics_proxy_.reset(); |
374 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8")); | 374 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp8")); |
375 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8")); | 375 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp8")); |
376 } | 376 } |
377 | 377 |
378 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9) { | 378 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9) { |
379 test::ClearHistograms(); | 379 test::ClearHistograms(); |
380 EncodedImage encoded_image; | 380 EncodedImage encoded_image; |
381 CodecSpecificInfo codec_info; | 381 RTPVideoHeader rtp_video_header; |
382 codec_info.codecType = kVideoCodecVP9; | 382 rtp_video_header.simulcastIdx = 0; |
383 codec_info.codecSpecific.VP9.num_spatial_layers = 2; | 383 rtp_video_header.codec = kRtpVideoVp9; |
| 384 rtp_video_header.codecHeader.VP9.num_spatial_layers = 2; |
384 | 385 |
385 for (int i = 0; i < kMinRequiredSamples; ++i) { | 386 for (int i = 0; i < kMinRequiredSamples; ++i) { |
386 encoded_image.qp_ = kQpIdx0; | 387 encoded_image.qp_ = kQpIdx0; |
387 codec_info.codecSpecific.VP9.spatial_idx = 0; | 388 rtp_video_header.codecHeader.VP9.spatial_idx = 0; |
388 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 389 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
389 encoded_image.qp_ = kQpIdx1; | 390 encoded_image.qp_ = kQpIdx1; |
390 codec_info.codecSpecific.VP9.spatial_idx = 1; | 391 rtp_video_header.codecHeader.VP9.spatial_idx = 1; |
391 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 392 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
392 } | 393 } |
393 statistics_proxy_.reset(); | 394 statistics_proxy_.reset(); |
394 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S0")); | 395 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S0")); |
395 EXPECT_EQ(kQpIdx0, | 396 EXPECT_EQ(kQpIdx0, |
396 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S0")); | 397 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S0")); |
397 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S1")); | 398 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S1")); |
398 EXPECT_EQ(kQpIdx1, | 399 EXPECT_EQ(kQpIdx1, |
399 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S1")); | 400 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S1")); |
400 } | 401 } |
401 | 402 |
402 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) { | 403 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) { |
403 VideoSendStream::Config config(nullptr); | 404 VideoSendStream::Config config(nullptr); |
404 config.rtp.ssrcs.push_back(kFirstSsrc); | 405 config.rtp.ssrcs.push_back(kFirstSsrc); |
405 statistics_proxy_.reset(new SendStatisticsProxy( | 406 statistics_proxy_.reset(new SendStatisticsProxy( |
406 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); | 407 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); |
407 | 408 |
408 test::ClearHistograms(); | 409 test::ClearHistograms(); |
409 EncodedImage encoded_image; | 410 EncodedImage encoded_image; |
410 CodecSpecificInfo codec_info; | 411 RTPVideoHeader rtp_video_header; |
411 codec_info.codecType = kVideoCodecVP9; | 412 rtp_video_header.simulcastIdx = 0; |
412 codec_info.codecSpecific.VP9.num_spatial_layers = 1; | 413 rtp_video_header.codec = kRtpVideoVp9; |
| 414 rtp_video_header.codecHeader.VP9.num_spatial_layers = 1; |
413 | 415 |
414 for (int i = 0; i < kMinRequiredSamples; ++i) { | 416 for (int i = 0; i < kMinRequiredSamples; ++i) { |
415 encoded_image.qp_ = kQpIdx0; | 417 encoded_image.qp_ = kQpIdx0; |
416 codec_info.codecSpecific.VP9.spatial_idx = 0; | 418 rtp_video_header.codecHeader.VP9.spatial_idx = 0; |
417 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 419 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
418 } | 420 } |
419 statistics_proxy_.reset(); | 421 statistics_proxy_.reset(); |
420 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9")); | 422 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9")); |
421 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9")); | 423 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9")); |
422 } | 424 } |
423 | 425 |
424 TEST_F(SendStatisticsProxyTest, NoSubstreams) { | 426 TEST_F(SendStatisticsProxyTest, NoSubstreams) { |
425 uint32_t excluded_ssrc = | 427 uint32_t excluded_ssrc = |
426 std::max( | 428 std::max( |
427 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()), | 429 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()), |
(...skipping 21 matching lines...) Expand all Loading... |
449 EXPECT_TRUE(stats.substreams.empty()); | 451 EXPECT_TRUE(stats.substreams.empty()); |
450 } | 452 } |
451 | 453 |
452 TEST_F(SendStatisticsProxyTest, EncodedResolutionTimesOut) { | 454 TEST_F(SendStatisticsProxyTest, EncodedResolutionTimesOut) { |
453 static const int kEncodedWidth = 123; | 455 static const int kEncodedWidth = 123; |
454 static const int kEncodedHeight = 81; | 456 static const int kEncodedHeight = 81; |
455 EncodedImage encoded_image; | 457 EncodedImage encoded_image; |
456 encoded_image._encodedWidth = kEncodedWidth; | 458 encoded_image._encodedWidth = kEncodedWidth; |
457 encoded_image._encodedHeight = kEncodedHeight; | 459 encoded_image._encodedHeight = kEncodedHeight; |
458 | 460 |
459 CodecSpecificInfo codec_info; | 461 RTPVideoHeader rtp_video_header; |
460 codec_info.codecType = kVideoCodecVP8; | |
461 codec_info.codecSpecific.VP8.simulcastIdx = 0; | |
462 | 462 |
463 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 463 rtp_video_header.simulcastIdx = 0; |
464 codec_info.codecSpecific.VP8.simulcastIdx = 1; | 464 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
465 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 465 rtp_video_header.simulcastIdx = 1; |
| 466 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
466 | 467 |
467 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); | 468 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); |
468 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); | 469 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); |
469 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); | 470 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); |
470 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); | 471 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); |
471 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); | 472 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); |
472 | 473 |
473 // Forward almost to timeout, this should not have removed stats. | 474 // Forward almost to timeout, this should not have removed stats. |
474 fake_clock_.AdvanceTimeMilliseconds(SendStatisticsProxy::kStatsTimeoutMs - 1); | 475 fake_clock_.AdvanceTimeMilliseconds(SendStatisticsProxy::kStatsTimeoutMs - 1); |
475 stats = statistics_proxy_->GetStats(); | 476 stats = statistics_proxy_->GetStats(); |
476 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); | 477 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); |
477 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); | 478 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); |
478 | 479 |
479 // Update the first SSRC with bogus RTCP stats to make sure that encoded | 480 // Update the first SSRC with bogus RTCP stats to make sure that encoded |
480 // resolution still times out (no global timeout for all stats). | 481 // resolution still times out (no global timeout for all stats). |
481 RtcpStatistics rtcp_statistics; | 482 RtcpStatistics rtcp_statistics; |
482 RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get(); | 483 RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get(); |
483 rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]); | 484 rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]); |
484 | 485 |
485 // Report stats for second SSRC to make sure it's not outdated along with the | 486 // Report stats for second SSRC to make sure it's not outdated along with the |
486 // first SSRC. | 487 // first SSRC. |
487 codec_info.codecSpecific.VP8.simulcastIdx = 1; | 488 rtp_video_header.simulcastIdx = 1; |
488 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 489 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
489 | 490 |
490 // Forward 1 ms, reach timeout, substream 0 should have no resolution | 491 // Forward 1 ms, reach timeout, substream 0 should have no resolution |
491 // reported, but substream 1 should. | 492 // reported, but substream 1 should. |
492 fake_clock_.AdvanceTimeMilliseconds(1); | 493 fake_clock_.AdvanceTimeMilliseconds(1); |
493 stats = statistics_proxy_->GetStats(); | 494 stats = statistics_proxy_->GetStats(); |
494 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].width); | 495 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].width); |
495 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].height); | 496 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].height); |
496 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); | 497 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); |
497 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); | 498 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); |
498 } | 499 } |
499 | 500 |
500 TEST_F(SendStatisticsProxyTest, ClearsResolutionFromInactiveSsrcs) { | 501 TEST_F(SendStatisticsProxyTest, ClearsResolutionFromInactiveSsrcs) { |
501 static const int kEncodedWidth = 123; | 502 static const int kEncodedWidth = 123; |
502 static const int kEncodedHeight = 81; | 503 static const int kEncodedHeight = 81; |
503 EncodedImage encoded_image; | 504 EncodedImage encoded_image; |
504 encoded_image._encodedWidth = kEncodedWidth; | 505 encoded_image._encodedWidth = kEncodedWidth; |
505 encoded_image._encodedHeight = kEncodedHeight; | 506 encoded_image._encodedHeight = kEncodedHeight; |
506 | 507 |
507 CodecSpecificInfo codec_info; | 508 RTPVideoHeader rtp_video_header; |
508 codec_info.codecType = kVideoCodecVP8; | |
509 codec_info.codecSpecific.VP8.simulcastIdx = 0; | |
510 | 509 |
511 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 510 rtp_video_header.simulcastIdx = 0; |
512 codec_info.codecSpecific.VP8.simulcastIdx = 1; | 511 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
513 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); | 512 rtp_video_header.simulcastIdx = 1; |
| 513 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); |
514 | 514 |
515 statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]); | 515 statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]); |
516 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); | 516 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); |
517 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); | 517 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); |
518 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); | 518 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); |
519 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].width); | 519 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].width); |
520 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].height); | 520 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].height); |
521 } | 521 } |
522 | 522 |
523 TEST_F(SendStatisticsProxyTest, ClearsBitratesFromInactiveSsrcs) { | 523 TEST_F(SendStatisticsProxyTest, ClearsBitratesFromInactiveSsrcs) { |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 | 749 |
750 EXPECT_EQ(1, test::NumHistogramSamples( | 750 EXPECT_EQ(1, test::NumHistogramSamples( |
751 "WebRTC.Video.Screenshare.FecBitrateSentInKbps")); | 751 "WebRTC.Video.Screenshare.FecBitrateSentInKbps")); |
752 EXPECT_EQ(static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / | 752 EXPECT_EQ(static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / |
753 metrics::kMinRunTimeInSeconds / 1000), | 753 metrics::kMinRunTimeInSeconds / 1000), |
754 test::LastHistogramSample( | 754 test::LastHistogramSample( |
755 "WebRTC.Video.Screenshare.FecBitrateSentInKbps")); | 755 "WebRTC.Video.Screenshare.FecBitrateSentInKbps")); |
756 } | 756 } |
757 | 757 |
758 } // namespace webrtc | 758 } // namespace webrtc |
OLD | NEW |