| 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 RTPVideoHeader rtp_video_header; | 337 CodecSpecificInfo codec_info; |
| 338 rtp_video_header.codec = kRtpVideoVp8; | 338 codec_info.codecType = kVideoCodecVP8; |
| 339 | 339 |
| 340 for (int i = 0; i < kMinRequiredSamples; ++i) { | 340 for (int i = 0; i < kMinRequiredSamples; ++i) { |
| 341 rtp_video_header.simulcastIdx = 0; | 341 codec_info.codecSpecific.VP8.simulcastIdx = 0; |
| 342 encoded_image.qp_ = kQpIdx0; | 342 encoded_image.qp_ = kQpIdx0; |
| 343 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 343 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 344 rtp_video_header.simulcastIdx = 1; | 344 codec_info.codecSpecific.VP8.simulcastIdx = 1; |
| 345 encoded_image.qp_ = kQpIdx1; | 345 encoded_image.qp_ = kQpIdx1; |
| 346 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 346 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 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 RTPVideoHeader rtp_video_header; | 365 CodecSpecificInfo codec_info; |
| 366 rtp_video_header.codec = kRtpVideoVp8; | 366 codec_info.codecType = kVideoCodecVP8; |
| 367 | 367 |
| 368 for (int i = 0; i < kMinRequiredSamples; ++i) { | 368 for (int i = 0; i < kMinRequiredSamples; ++i) { |
| 369 rtp_video_header.simulcastIdx = 0; | 369 codec_info.codecSpecific.VP8.simulcastIdx = 0; |
| 370 encoded_image.qp_ = kQpIdx0; | 370 encoded_image.qp_ = kQpIdx0; |
| 371 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 371 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 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 RTPVideoHeader rtp_video_header; | 381 CodecSpecificInfo codec_info; |
| 382 rtp_video_header.simulcastIdx = 0; | 382 codec_info.codecType = kVideoCodecVP9; |
| 383 rtp_video_header.codec = kRtpVideoVp9; | 383 codec_info.codecSpecific.VP9.num_spatial_layers = 2; |
| 384 rtp_video_header.codecHeader.VP9.num_spatial_layers = 2; | |
| 385 | 384 |
| 386 for (int i = 0; i < kMinRequiredSamples; ++i) { | 385 for (int i = 0; i < kMinRequiredSamples; ++i) { |
| 387 encoded_image.qp_ = kQpIdx0; | 386 encoded_image.qp_ = kQpIdx0; |
| 388 rtp_video_header.codecHeader.VP9.spatial_idx = 0; | 387 codec_info.codecSpecific.VP9.spatial_idx = 0; |
| 389 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 388 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 390 encoded_image.qp_ = kQpIdx1; | 389 encoded_image.qp_ = kQpIdx1; |
| 391 rtp_video_header.codecHeader.VP9.spatial_idx = 1; | 390 codec_info.codecSpecific.VP9.spatial_idx = 1; |
| 392 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 391 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 393 } | 392 } |
| 394 statistics_proxy_.reset(); | 393 statistics_proxy_.reset(); |
| 395 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S0")); | 394 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S0")); |
| 396 EXPECT_EQ(kQpIdx0, | 395 EXPECT_EQ(kQpIdx0, |
| 397 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S0")); | 396 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S0")); |
| 398 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S1")); | 397 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9.S1")); |
| 399 EXPECT_EQ(kQpIdx1, | 398 EXPECT_EQ(kQpIdx1, |
| 400 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S1")); | 399 test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9.S1")); |
| 401 } | 400 } |
| 402 | 401 |
| 403 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) { | 402 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) { |
| 404 VideoSendStream::Config config(nullptr); | 403 VideoSendStream::Config config(nullptr); |
| 405 config.rtp.ssrcs.push_back(kFirstSsrc); | 404 config.rtp.ssrcs.push_back(kFirstSsrc); |
| 406 statistics_proxy_.reset(new SendStatisticsProxy( | 405 statistics_proxy_.reset(new SendStatisticsProxy( |
| 407 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); | 406 &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo)); |
| 408 | 407 |
| 409 test::ClearHistograms(); | 408 test::ClearHistograms(); |
| 410 EncodedImage encoded_image; | 409 EncodedImage encoded_image; |
| 411 RTPVideoHeader rtp_video_header; | 410 CodecSpecificInfo codec_info; |
| 412 rtp_video_header.simulcastIdx = 0; | 411 codec_info.codecType = kVideoCodecVP9; |
| 413 rtp_video_header.codec = kRtpVideoVp9; | 412 codec_info.codecSpecific.VP9.num_spatial_layers = 1; |
| 414 rtp_video_header.codecHeader.VP9.num_spatial_layers = 1; | |
| 415 | 413 |
| 416 for (int i = 0; i < kMinRequiredSamples; ++i) { | 414 for (int i = 0; i < kMinRequiredSamples; ++i) { |
| 417 encoded_image.qp_ = kQpIdx0; | 415 encoded_image.qp_ = kQpIdx0; |
| 418 rtp_video_header.codecHeader.VP9.spatial_idx = 0; | 416 codec_info.codecSpecific.VP9.spatial_idx = 0; |
| 419 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 417 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 420 } | 418 } |
| 421 statistics_proxy_.reset(); | 419 statistics_proxy_.reset(); |
| 422 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9")); | 420 EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.Encoded.Qp.Vp9")); |
| 423 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9")); | 421 EXPECT_EQ(kQpIdx0, test::LastHistogramSample("WebRTC.Video.Encoded.Qp.Vp9")); |
| 424 } | 422 } |
| 425 | 423 |
| 426 TEST_F(SendStatisticsProxyTest, NoSubstreams) { | 424 TEST_F(SendStatisticsProxyTest, NoSubstreams) { |
| 427 uint32_t excluded_ssrc = | 425 uint32_t excluded_ssrc = |
| 428 std::max( | 426 std::max( |
| 429 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()), | 427 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 451 EXPECT_TRUE(stats.substreams.empty()); | 449 EXPECT_TRUE(stats.substreams.empty()); |
| 452 } | 450 } |
| 453 | 451 |
| 454 TEST_F(SendStatisticsProxyTest, EncodedResolutionTimesOut) { | 452 TEST_F(SendStatisticsProxyTest, EncodedResolutionTimesOut) { |
| 455 static const int kEncodedWidth = 123; | 453 static const int kEncodedWidth = 123; |
| 456 static const int kEncodedHeight = 81; | 454 static const int kEncodedHeight = 81; |
| 457 EncodedImage encoded_image; | 455 EncodedImage encoded_image; |
| 458 encoded_image._encodedWidth = kEncodedWidth; | 456 encoded_image._encodedWidth = kEncodedWidth; |
| 459 encoded_image._encodedHeight = kEncodedHeight; | 457 encoded_image._encodedHeight = kEncodedHeight; |
| 460 | 458 |
| 461 RTPVideoHeader rtp_video_header; | 459 CodecSpecificInfo codec_info; |
| 460 codec_info.codecType = kVideoCodecVP8; |
| 461 codec_info.codecSpecific.VP8.simulcastIdx = 0; |
| 462 | 462 |
| 463 rtp_video_header.simulcastIdx = 0; | 463 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 464 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 464 codec_info.codecSpecific.VP8.simulcastIdx = 1; |
| 465 rtp_video_header.simulcastIdx = 1; | 465 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 466 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | |
| 467 | 466 |
| 468 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); | 467 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); |
| 469 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); | 468 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); |
| 470 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); | 469 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); |
| 471 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); | 470 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); |
| 472 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); | 471 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); |
| 473 | 472 |
| 474 // Forward almost to timeout, this should not have removed stats. | 473 // Forward almost to timeout, this should not have removed stats. |
| 475 fake_clock_.AdvanceTimeMilliseconds(SendStatisticsProxy::kStatsTimeoutMs - 1); | 474 fake_clock_.AdvanceTimeMilliseconds(SendStatisticsProxy::kStatsTimeoutMs - 1); |
| 476 stats = statistics_proxy_->GetStats(); | 475 stats = statistics_proxy_->GetStats(); |
| 477 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); | 476 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width); |
| 478 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); | 477 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height); |
| 479 | 478 |
| 480 // Update the first SSRC with bogus RTCP stats to make sure that encoded | 479 // Update the first SSRC with bogus RTCP stats to make sure that encoded |
| 481 // resolution still times out (no global timeout for all stats). | 480 // resolution still times out (no global timeout for all stats). |
| 482 RtcpStatistics rtcp_statistics; | 481 RtcpStatistics rtcp_statistics; |
| 483 RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get(); | 482 RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get(); |
| 484 rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]); | 483 rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]); |
| 485 | 484 |
| 486 // Report stats for second SSRC to make sure it's not outdated along with the | 485 // Report stats for second SSRC to make sure it's not outdated along with the |
| 487 // first SSRC. | 486 // first SSRC. |
| 488 rtp_video_header.simulcastIdx = 1; | 487 codec_info.codecSpecific.VP8.simulcastIdx = 1; |
| 489 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 488 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 490 | 489 |
| 491 // Forward 1 ms, reach timeout, substream 0 should have no resolution | 490 // Forward 1 ms, reach timeout, substream 0 should have no resolution |
| 492 // reported, but substream 1 should. | 491 // reported, but substream 1 should. |
| 493 fake_clock_.AdvanceTimeMilliseconds(1); | 492 fake_clock_.AdvanceTimeMilliseconds(1); |
| 494 stats = statistics_proxy_->GetStats(); | 493 stats = statistics_proxy_->GetStats(); |
| 495 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].width); | 494 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].width); |
| 496 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].height); | 495 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].height); |
| 497 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); | 496 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width); |
| 498 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); | 497 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height); |
| 499 } | 498 } |
| 500 | 499 |
| 501 TEST_F(SendStatisticsProxyTest, ClearsResolutionFromInactiveSsrcs) { | 500 TEST_F(SendStatisticsProxyTest, ClearsResolutionFromInactiveSsrcs) { |
| 502 static const int kEncodedWidth = 123; | 501 static const int kEncodedWidth = 123; |
| 503 static const int kEncodedHeight = 81; | 502 static const int kEncodedHeight = 81; |
| 504 EncodedImage encoded_image; | 503 EncodedImage encoded_image; |
| 505 encoded_image._encodedWidth = kEncodedWidth; | 504 encoded_image._encodedWidth = kEncodedWidth; |
| 506 encoded_image._encodedHeight = kEncodedHeight; | 505 encoded_image._encodedHeight = kEncodedHeight; |
| 507 | 506 |
| 508 RTPVideoHeader rtp_video_header; | 507 CodecSpecificInfo codec_info; |
| 508 codec_info.codecType = kVideoCodecVP8; |
| 509 codec_info.codecSpecific.VP8.simulcastIdx = 0; |
| 509 | 510 |
| 510 rtp_video_header.simulcastIdx = 0; | 511 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 511 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header); | 512 codec_info.codecSpecific.VP8.simulcastIdx = 1; |
| 512 rtp_video_header.simulcastIdx = 1; | 513 statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| 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 |