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