blob: 66856a70ade72fff3c42b9a486f607e075b4c9fb [file] [log] [blame]
sakale5ba44e2016-10-26 07:09:24 -07001/*
2 * Copyright 2016 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/video/receive_statistics_proxy.h"
12
13#include <memory>
14
asaperssonde9e5ff2016-11-02 07:14:03 -070015#include "webrtc/system_wrappers/include/metrics_default.h"
sakale5ba44e2016-10-26 07:09:24 -070016#include "webrtc/test/gtest.h"
17
18namespace webrtc {
asaperssonde9e5ff2016-11-02 07:14:03 -070019namespace {
20const int64_t kFreqOffsetProcessIntervalInMs = 40000;
asapersson46c4e3c2016-11-03 06:48:19 -070021const uint32_t kLocalSsrc = 123;
22const uint32_t kRemoteSsrc = 456;
23const int kMinRequiredSamples = 200;
asaperssonde9e5ff2016-11-02 07:14:03 -070024} // namespace
sakale5ba44e2016-10-26 07:09:24 -070025
26// TODO(sakal): ReceiveStatisticsProxy is lacking unittesting.
27class ReceiveStatisticsProxyTest : public ::testing::Test {
28 public:
29 ReceiveStatisticsProxyTest() : fake_clock_(1234), config_(GetTestConfig()) {}
30 virtual ~ReceiveStatisticsProxyTest() {}
31
32 protected:
33 virtual void SetUp() {
asaperssonde9e5ff2016-11-02 07:14:03 -070034 metrics::Reset();
sakale5ba44e2016-10-26 07:09:24 -070035 statistics_proxy_.reset(new ReceiveStatisticsProxy(&config_, &fake_clock_));
36 }
37
38 VideoReceiveStream::Config GetTestConfig() {
39 VideoReceiveStream::Config config(nullptr);
asapersson46c4e3c2016-11-03 06:48:19 -070040 config.rtp.local_ssrc = kLocalSsrc;
41 config.rtp.remote_ssrc = kRemoteSsrc;
sakale5ba44e2016-10-26 07:09:24 -070042 return config;
43 }
44
45 SimulatedClock fake_clock_;
asaperssonde9e5ff2016-11-02 07:14:03 -070046 const VideoReceiveStream::Config config_;
sakale5ba44e2016-10-26 07:09:24 -070047 std::unique_ptr<ReceiveStatisticsProxy> statistics_proxy_;
sakale5ba44e2016-10-26 07:09:24 -070048};
49
50TEST_F(ReceiveStatisticsProxyTest, OnDecodedFrameIncreasesFramesDecoded) {
51 EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_decoded);
52 for (uint32_t i = 1; i <= 3; ++i) {
53 statistics_proxy_->OnDecodedFrame();
54 EXPECT_EQ(i, statistics_proxy_->GetStats().frames_decoded);
55 }
56}
57
asapersson46c4e3c2016-11-03 06:48:19 -070058TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsSsrc) {
59 EXPECT_EQ(kRemoteSsrc, statistics_proxy_->GetStats().ssrc);
60}
61
62TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsIncomingPayloadType) {
63 const int kPayloadType = 111;
64 statistics_proxy_->OnIncomingPayloadType(kPayloadType);
65 EXPECT_EQ(kPayloadType, statistics_proxy_->GetStats().current_payload_type);
66}
67
68TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsIncomingRate) {
69 const int kFramerate = 28;
70 const int kBitrateBps = 311000;
71 statistics_proxy_->OnIncomingRate(kFramerate, kBitrateBps);
72 EXPECT_EQ(kFramerate, statistics_proxy_->GetStats().network_frame_rate);
73 EXPECT_EQ(kBitrateBps, statistics_proxy_->GetStats().total_bitrate_bps);
74}
75
76TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsDecodeTimingStats) {
77 const int kDecodeMs = 1;
78 const int kMaxDecodeMs = 2;
79 const int kCurrentDelayMs = 3;
80 const int kTargetDelayMs = 4;
81 const int kJitterBufferMs = 5;
82 const int kMinPlayoutDelayMs = 6;
83 const int kRenderDelayMs = 7;
84 const int64_t kRttMs = 8;
85 statistics_proxy_->OnDecoderTiming(
86 kDecodeMs, kMaxDecodeMs, kCurrentDelayMs, kTargetDelayMs, kJitterBufferMs,
87 kMinPlayoutDelayMs, kRenderDelayMs, kRttMs);
88 VideoReceiveStream::Stats stats = statistics_proxy_->GetStats();
89 EXPECT_EQ(kDecodeMs, stats.decode_ms);
90 EXPECT_EQ(kMaxDecodeMs, stats.max_decode_ms);
91 EXPECT_EQ(kCurrentDelayMs, stats.current_delay_ms);
92 EXPECT_EQ(kTargetDelayMs, stats.target_delay_ms);
93 EXPECT_EQ(kJitterBufferMs, stats.jitter_buffer_ms);
94 EXPECT_EQ(kMinPlayoutDelayMs, stats.min_playout_delay_ms);
95 EXPECT_EQ(kRenderDelayMs, stats.render_delay_ms);
96}
97
98TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsDiscardedPackets) {
99 const int kDiscardedPackets = 12;
100 statistics_proxy_->OnDiscardedPacketsUpdated(kDiscardedPackets);
101 EXPECT_EQ(kDiscardedPackets, statistics_proxy_->GetStats().discarded_packets);
102}
103
104TEST_F(ReceiveStatisticsProxyTest, LifetimeHistogramIsUpdated) {
105 const int64_t kTimeSec = 3;
106 fake_clock_.AdvanceTimeMilliseconds(kTimeSec * 1000);
107 // Histograms are updated when the statistics_proxy_ is deleted.
108 statistics_proxy_.reset();
109 EXPECT_EQ(1,
110 metrics::NumSamples("WebRTC.Video.ReceiveStreamLifetimeInSeconds"));
111 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.ReceiveStreamLifetimeInSeconds",
112 kTimeSec));
113}
114
115TEST_F(ReceiveStatisticsProxyTest, AvSyncOffsetHistogramIsUpdated) {
116 const int64_t kSyncOffsetMs = 22;
117 const double kFreqKhz = 90.0;
118 for (int i = 0; i < kMinRequiredSamples; ++i)
119 statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz);
120 // Histograms are updated when the statistics_proxy_ is deleted.
121 statistics_proxy_.reset();
122 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AVSyncOffsetInMs"));
123 EXPECT_EQ(1,
124 metrics::NumEvents("WebRTC.Video.AVSyncOffsetInMs", kSyncOffsetMs));
125}
126
asaperssonde9e5ff2016-11-02 07:14:03 -0700127TEST_F(ReceiveStatisticsProxyTest, RtpToNtpFrequencyOffsetHistogramIsUpdated) {
128 const int64_t kSyncOffsetMs = 22;
129 const double kFreqKhz = 90.0;
130 statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz);
131 statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz + 2.2);
132 fake_clock_.AdvanceTimeMilliseconds(kFreqOffsetProcessIntervalInMs);
133 // Process interval passed, max diff: 2.
134 statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz + 1.1);
135 statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz - 4.2);
136 statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz - 0.9);
137 fake_clock_.AdvanceTimeMilliseconds(kFreqOffsetProcessIntervalInMs);
138 // Process interval passed, max diff: 4.
139 statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz);
140 statistics_proxy_.reset();
141 // Average reported: (2 + 4) / 2 = 3.
142 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtpToNtpFreqOffsetInKhz"));
143 EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtpToNtpFreqOffsetInKhz", 3));
144}
145
sakale5ba44e2016-10-26 07:09:24 -0700146} // namespace webrtc