1c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org/* 2c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org * 4c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org * Use of this source code is governed by a BSD-style license 5c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org * that can be found in the LICENSE file in the root of the source 6c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org * tree. An additional intellectual property rights grant can be found 7c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org * in the file PATENTS. All contributing project authors may 8c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org */ 10c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 11c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/video/receive_statistics_proxy.h" 12c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 13c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/system_wrappers/interface/clock.h" 14c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 15c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 16c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgnamespace webrtc { 17c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgnamespace internal { 18c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 19c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgReceiveStatisticsProxy::ReceiveStatisticsProxy(uint32_t ssrc, 20c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org Clock* clock, 21c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org ViERTP_RTCP* rtp_rtcp, 22c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org ViECodec* codec, 23c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org int channel) 24c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org : channel_(channel), 25c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org clock_(clock), 26c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org codec_(codec), 27c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org rtp_rtcp_(rtp_rtcp), 28c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org crit_(CriticalSectionWrapper::CreateCriticalSection()), 29c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org // 1000ms window, scale 1000 for ms to s. 30c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org decode_fps_estimator_(1000, 1000), 31c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org renders_fps_estimator_(1000, 1000) { 32c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats_.ssrc = ssrc; 33c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 34c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 35c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgReceiveStatisticsProxy::~ReceiveStatisticsProxy() {} 36c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 37c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgVideoReceiveStream::Stats ReceiveStatisticsProxy::GetStats() const { 38c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org VideoReceiveStream::Stats stats; 39c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org { 40c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org CriticalSectionScoped lock(crit_.get()); 41c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats = stats_; 42c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org } 43c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats.c_name = GetCName(); 44c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org codec_->GetReceiveSideDelay(channel_, &stats.avg_delay_ms); 4566a45b1ce8380ffb3fffabebe1e49d1904c6bfc0asapersson@webrtc.org stats.discarded_packets = codec_->GetNumDiscardedPackets(channel_); 46c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org codec_->GetReceiveCodecStastistics( 47c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org channel_, stats.key_frames, stats.delta_frames); 48c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 49c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org return stats; 50c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 51c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 52c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgstd::string ReceiveStatisticsProxy::GetCName() const { 53c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org char rtcp_cname[ViERTP_RTCP::KMaxRTCPCNameLength]; 54c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org if (rtp_rtcp_->GetRemoteRTCPCName(channel_, rtcp_cname) != 0) 55c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org rtcp_cname[0] = '\0'; 56c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org return rtcp_cname; 57c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 58c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 59c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgvoid ReceiveStatisticsProxy::IncomingRate(const int video_channel, 60c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org const unsigned int framerate, 61c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org const unsigned int bitrate) { 62c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org CriticalSectionScoped lock(crit_.get()); 63c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats_.network_frame_rate = framerate; 64c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats_.bitrate_bps = bitrate; 65c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 66c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 67c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgvoid ReceiveStatisticsProxy::StatisticsUpdated( 68c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org const webrtc::RtcpStatistics& statistics, 69c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org uint32_t ssrc) { 70c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org CriticalSectionScoped lock(crit_.get()); 71c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 72c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats_.rtcp_stats = statistics; 73c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 74c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 75c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgvoid ReceiveStatisticsProxy::DataCountersUpdated( 76c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org const webrtc::StreamDataCounters& counters, 77c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org uint32_t ssrc) { 78c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org CriticalSectionScoped lock(crit_.get()); 79c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 80c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats_.rtp_stats = counters; 81c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 82c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 83c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgvoid ReceiveStatisticsProxy::OnDecodedFrame() { 84c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org uint64_t now = clock_->TimeInMilliseconds(); 85c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 86c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org CriticalSectionScoped lock(crit_.get()); 87c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org decode_fps_estimator_.Update(1, now); 88c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats_.decode_frame_rate = decode_fps_estimator_.Rate(now); 89c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 90c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 91c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgvoid ReceiveStatisticsProxy::OnRenderedFrame() { 92c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org uint64_t now = clock_->TimeInMilliseconds(); 93c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 94c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org CriticalSectionScoped lock(crit_.get()); 95c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org renders_fps_estimator_.Update(1, now); 96c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org stats_.render_frame_rate = renders_fps_estimator_.Rate(now); 97c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} 98c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org 99c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} // namespace internal 100c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org} // namespace webrtc 101