Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(242)

Side by Side Diff: webrtc/video/receive_statistics_proxy.cc

Issue 2775813002: Change VideoReceiveStream::Stats total_bitrate_bps to include all received packets. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 kHighVarianceThreshold, 66 kHighVarianceThreshold,
67 kBadFraction, 67 kBadFraction,
68 kNumMeasurementsVariance), 68 kNumMeasurementsVariance),
69 num_bad_states_(0), 69 num_bad_states_(0),
70 num_certain_states_(0), 70 num_certain_states_(0),
71 // 1000ms window, scale 1000 for ms to s. 71 // 1000ms window, scale 1000 for ms to s.
72 decode_fps_estimator_(1000, 1000), 72 decode_fps_estimator_(1000, 1000),
73 renders_fps_estimator_(1000, 1000), 73 renders_fps_estimator_(1000, 1000),
74 render_fps_tracker_(100, 10u), 74 render_fps_tracker_(100, 10u),
75 render_pixel_tracker_(100, 10u), 75 render_pixel_tracker_(100, 10u),
76 total_byte_tracker_(100, 10u), // bucket_interval_ms, bucket_count
76 freq_offset_counter_(clock, nullptr, kFreqOffsetProcessIntervalMs), 77 freq_offset_counter_(clock, nullptr, kFreqOffsetProcessIntervalMs),
77 first_report_block_time_ms_(-1), 78 first_report_block_time_ms_(-1),
78 avg_rtt_ms_(0), 79 avg_rtt_ms_(0) {
79 frame_window_accumulated_bytes_(0) {
80 stats_.ssrc = config_.rtp.remote_ssrc; 80 stats_.ssrc = config_.rtp.remote_ssrc;
81 // TODO(brandtr): Replace |rtx_stats_| with a single instance of 81 // TODO(brandtr): Replace |rtx_stats_| with a single instance of
82 // StreamDataCounters. 82 // StreamDataCounters.
83 if (config_.rtp.rtx_ssrc) { 83 if (config_.rtp.rtx_ssrc) {
84 rtx_stats_[config_.rtp.rtx_ssrc] = StreamDataCounters(); 84 rtx_stats_[config_.rtp.rtx_ssrc] = StreamDataCounters();
85 } 85 }
86 } 86 }
87 87
88 ReceiveStatisticsProxy::~ReceiveStatisticsProxy() { 88 ReceiveStatisticsProxy::~ReceiveStatisticsProxy() {
89 UpdateHistograms(); 89 UpdateHistograms();
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 qp_sample_.Reset(); 305 qp_sample_.Reset();
306 306
307 if (fps_threshold_.IsHigh() || variance_threshold_.IsHigh() || 307 if (fps_threshold_.IsHigh() || variance_threshold_.IsHigh() ||
308 qp_threshold_.IsHigh()) { 308 qp_threshold_.IsHigh()) {
309 if (any_bad) 309 if (any_bad)
310 ++num_bad_states_; 310 ++num_bad_states_;
311 ++num_certain_states_; 311 ++num_certain_states_;
312 } 312 }
313 } 313 }
314 314
315 void ReceiveStatisticsProxy::UpdateFrameAndBitrate(int64_t now_ms) const { 315 void ReceiveStatisticsProxy::UpdateFramerate(int64_t now_ms) const {
316 int64_t old_frames_ms = now_ms - kRateStatisticsWindowSizeMs; 316 int64_t old_frames_ms = now_ms - kRateStatisticsWindowSizeMs;
317 while (!frame_window_.empty() && 317 while (!frame_window_.empty() &&
318 frame_window_.begin()->first < old_frames_ms) { 318 frame_window_.begin()->first < old_frames_ms) {
319 frame_window_accumulated_bytes_ -= frame_window_.begin()->second;
320 frame_window_.erase(frame_window_.begin()); 319 frame_window_.erase(frame_window_.begin());
321 } 320 }
322 321
323 size_t framerate = 322 size_t framerate =
324 (frame_window_.size() * 1000 + 500) / kRateStatisticsWindowSizeMs; 323 (frame_window_.size() * 1000 + 500) / kRateStatisticsWindowSizeMs;
325 size_t bitrate_bps =
326 frame_window_accumulated_bytes_ * 8000 / kRateStatisticsWindowSizeMs;
327 stats_.network_frame_rate = static_cast<int>(framerate); 324 stats_.network_frame_rate = static_cast<int>(framerate);
328 stats_.total_bitrate_bps = static_cast<int>(bitrate_bps);
329 } 325 }
330 326
331 VideoReceiveStream::Stats ReceiveStatisticsProxy::GetStats() const { 327 VideoReceiveStream::Stats ReceiveStatisticsProxy::GetStats() const {
332 rtc::CritScope lock(&crit_); 328 rtc::CritScope lock(&crit_);
333 UpdateFrameAndBitrate(clock_->TimeInMilliseconds()); 329 UpdateFramerate(clock_->TimeInMilliseconds());
330 stats_.total_bitrate_bps =
331 static_cast<int>(total_byte_tracker_.ComputeRate() * 8);
334 return stats_; 332 return stats_;
335 } 333 }
336 334
337 void ReceiveStatisticsProxy::OnIncomingPayloadType(int payload_type) { 335 void ReceiveStatisticsProxy::OnIncomingPayloadType(int payload_type) {
338 rtc::CritScope lock(&crit_); 336 rtc::CritScope lock(&crit_);
339 stats_.current_payload_type = payload_type; 337 stats_.current_payload_type = payload_type;
340 } 338 }
341 339
342 void ReceiveStatisticsProxy::OnDecoderImplementationName( 340 void ReceiveStatisticsProxy::OnDecoderImplementationName(
343 const char* implementation_name) { 341 const char* implementation_name) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 // TODO(pbos): Handle both local and remote ssrcs here and RTC_DCHECK that we 403 // TODO(pbos): Handle both local and remote ssrcs here and RTC_DCHECK that we
406 // receive stats from one of them. 404 // receive stats from one of them.
407 if (stats_.ssrc != ssrc) 405 if (stats_.ssrc != ssrc)
408 return; 406 return;
409 stats_.c_name = cname; 407 stats_.c_name = cname;
410 } 408 }
411 409
412 void ReceiveStatisticsProxy::DataCountersUpdated( 410 void ReceiveStatisticsProxy::DataCountersUpdated(
413 const webrtc::StreamDataCounters& counters, 411 const webrtc::StreamDataCounters& counters,
414 uint32_t ssrc) { 412 uint32_t ssrc) {
413 size_t last_total_bytes = 0;
414 size_t total_bytes = 0;
415 rtc::CritScope lock(&crit_); 415 rtc::CritScope lock(&crit_);
416 if (ssrc == stats_.ssrc) { 416 if (ssrc == stats_.ssrc) {
417 last_total_bytes = stats_.rtp_stats.transmitted.TotalBytes();
418 total_bytes = counters.transmitted.TotalBytes();
417 stats_.rtp_stats = counters; 419 stats_.rtp_stats = counters;
418 } else { 420 } else {
419 auto it = rtx_stats_.find(ssrc); 421 auto it = rtx_stats_.find(ssrc);
420 if (it != rtx_stats_.end()) { 422 if (it != rtx_stats_.end()) {
423 last_total_bytes = it->second.transmitted.TotalBytes();
424 total_bytes = counters.transmitted.TotalBytes();
421 it->second = counters; 425 it->second = counters;
422 } else { 426 } else {
423 RTC_NOTREACHED() << "Unexpected stream ssrc: " << ssrc; 427 RTC_NOTREACHED() << "Unexpected stream ssrc: " << ssrc;
424 } 428 }
425 } 429 }
430 if (total_bytes > last_total_bytes)
stefan-webrtc 2017/03/28 07:13:02 What should we do if this is not true? Seems like
åsapersson 2017/03/28 07:59:23 Not sure if it can happen but if the counters are
stefan-webrtc 2017/03/28 09:18:53 Ok.
431 total_byte_tracker_.AddSamples(total_bytes - last_total_bytes);
426 } 432 }
427 433
428 void ReceiveStatisticsProxy::OnDecodedFrame(rtc::Optional<uint8_t> qp) { 434 void ReceiveStatisticsProxy::OnDecodedFrame(rtc::Optional<uint8_t> qp) {
429 uint64_t now = clock_->TimeInMilliseconds(); 435 uint64_t now = clock_->TimeInMilliseconds();
430 436
431 rtc::CritScope lock(&crit_); 437 rtc::CritScope lock(&crit_);
432 ++stats_.frames_decoded; 438 ++stats_.frames_decoded;
433 if (qp) { 439 if (qp) {
434 if (!stats_.qp_sum) { 440 if (!stats_.qp_sum) {
435 if (stats_.frames_decoded != 1) { 441 if (stats_.frames_decoded != 1) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 501
496 void ReceiveStatisticsProxy::OnCompleteFrame(bool is_keyframe, 502 void ReceiveStatisticsProxy::OnCompleteFrame(bool is_keyframe,
497 size_t size_bytes) { 503 size_t size_bytes) {
498 rtc::CritScope lock(&crit_); 504 rtc::CritScope lock(&crit_);
499 if (is_keyframe) 505 if (is_keyframe)
500 ++stats_.frame_counts.key_frames; 506 ++stats_.frame_counts.key_frames;
501 else 507 else
502 ++stats_.frame_counts.delta_frames; 508 ++stats_.frame_counts.delta_frames;
503 509
504 int64_t now_ms = clock_->TimeInMilliseconds(); 510 int64_t now_ms = clock_->TimeInMilliseconds();
505 frame_window_accumulated_bytes_ += size_bytes;
506 frame_window_.insert(std::make_pair(now_ms, size_bytes)); 511 frame_window_.insert(std::make_pair(now_ms, size_bytes));
507 UpdateFrameAndBitrate(now_ms); 512 UpdateFramerate(now_ms);
508 } 513 }
509 514
510 void ReceiveStatisticsProxy::OnFrameCountsUpdated( 515 void ReceiveStatisticsProxy::OnFrameCountsUpdated(
511 const FrameCounts& frame_counts) { 516 const FrameCounts& frame_counts) {
512 rtc::CritScope lock(&crit_); 517 rtc::CritScope lock(&crit_);
513 stats_.frame_counts = frame_counts; 518 stats_.frame_counts = frame_counts;
514 } 519 }
515 520
516 void ReceiveStatisticsProxy::OnDiscardedPacketsUpdated(int discarded_packets) { 521 void ReceiveStatisticsProxy::OnDiscardedPacketsUpdated(int discarded_packets) {
517 rtc::CritScope lock(&crit_); 522 rtc::CritScope lock(&crit_);
(...skipping 30 matching lines...) Expand all
548 sum = 0; 553 sum = 0;
549 } 554 }
550 555
551 void ReceiveStatisticsProxy::OnRttUpdate(int64_t avg_rtt_ms, 556 void ReceiveStatisticsProxy::OnRttUpdate(int64_t avg_rtt_ms,
552 int64_t max_rtt_ms) { 557 int64_t max_rtt_ms) {
553 rtc::CritScope lock(&crit_); 558 rtc::CritScope lock(&crit_);
554 avg_rtt_ms_ = avg_rtt_ms; 559 avg_rtt_ms_ = avg_rtt_ms;
555 } 560 }
556 561
557 } // namespace webrtc 562 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698