blob: 1bf9814412a6380f550af82afcede438d0a22ec5 [file] [log] [blame]
sprang@webrtc.orgccd42842014-01-07 09:54:34 +00001/*
2 * Copyright (c) 2013 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// This file includes unit tests for SendStatisticsProxy.
12#include "webrtc/video/send_statistics_proxy.h"
13
14#include <map>
15#include <string>
16#include <vector>
17
18#include "testing/gtest/include/gtest/gtest.h"
19
20namespace webrtc {
21
stefan@webrtc.org168f23f2014-07-11 13:44:02 +000022class SendStatisticsProxyTest : public ::testing::Test {
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000023 public:
pbos@webrtc.org273a4142014-12-01 15:23:21 +000024 SendStatisticsProxyTest()
solenberg4fbae2b2015-08-28 04:07:10 -070025 : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0),
26 max_delay_ms_(0) {}
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000027 virtual ~SendStatisticsProxyTest() {}
28
29 protected:
30 virtual void SetUp() {
sprangb4a1ae52015-12-03 08:10:08 -080031 statistics_proxy_.reset(new SendStatisticsProxy(
32 &fake_clock_, GetTestConfig(),
33 VideoEncoderConfig::ContentType::kRealtimeVideo));
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000034 expected_ = VideoSendStream::Stats();
35 }
36
37 VideoSendStream::Config GetTestConfig() {
solenberg4fbae2b2015-08-28 04:07:10 -070038 VideoSendStream::Config config(nullptr);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000039 config.rtp.ssrcs.push_back(17);
40 config.rtp.ssrcs.push_back(42);
stefan@webrtc.org58e2d262014-08-14 15:10:49 +000041 config.rtp.rtx.ssrcs.push_back(18);
42 config.rtp.rtx.ssrcs.push_back(43);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000043 return config;
44 }
45
sprang@webrtc.org09315702014-02-07 12:06:29 +000046 void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) {
sprang@webrtc.org09315702014-02-07 12:06:29 +000047 EXPECT_EQ(one.input_frame_rate, other.input_frame_rate);
48 EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate);
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +000049 EXPECT_EQ(one.media_bitrate_bps, other.media_bitrate_bps);
henrik.lundin@webrtc.orgb10363f2014-03-13 13:31:21 +000050 EXPECT_EQ(one.suspended, other.suspended);
sprang@webrtc.org09315702014-02-07 12:06:29 +000051
52 EXPECT_EQ(one.substreams.size(), other.substreams.size());
pbos@webrtc.org09c77b92015-02-25 10:42:16 +000053 for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it =
sprang@webrtc.org09315702014-02-07 12:06:29 +000054 one.substreams.begin();
pbos@webrtc.org09c77b92015-02-25 10:42:16 +000055 it != one.substreams.end(); ++it) {
56 std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator
57 corresponding_it = other.substreams.find(it->first);
sprang@webrtc.org09315702014-02-07 12:06:29 +000058 ASSERT_TRUE(corresponding_it != other.substreams.end());
pbos@webrtc.org09c77b92015-02-25 10:42:16 +000059 const VideoSendStream::StreamStats& a = it->second;
60 const VideoSendStream::StreamStats& b = corresponding_it->second;
sprang@webrtc.org09315702014-02-07 12:06:29 +000061
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +000062 EXPECT_EQ(a.frame_counts.key_frames, b.frame_counts.key_frames);
63 EXPECT_EQ(a.frame_counts.delta_frames, b.frame_counts.delta_frames);
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +000064 EXPECT_EQ(a.total_bitrate_bps, b.total_bitrate_bps);
stefan@webrtc.org168f23f2014-07-11 13:44:02 +000065 EXPECT_EQ(a.avg_delay_ms, b.avg_delay_ms);
66 EXPECT_EQ(a.max_delay_ms, b.max_delay_ms);
sprang@webrtc.org09315702014-02-07 12:06:29 +000067
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +000068 EXPECT_EQ(a.rtp_stats.transmitted.payload_bytes,
69 b.rtp_stats.transmitted.payload_bytes);
70 EXPECT_EQ(a.rtp_stats.transmitted.header_bytes,
71 b.rtp_stats.transmitted.header_bytes);
72 EXPECT_EQ(a.rtp_stats.transmitted.padding_bytes,
73 b.rtp_stats.transmitted.padding_bytes);
74 EXPECT_EQ(a.rtp_stats.transmitted.packets,
75 b.rtp_stats.transmitted.packets);
76 EXPECT_EQ(a.rtp_stats.retransmitted.packets,
77 b.rtp_stats.retransmitted.packets);
78 EXPECT_EQ(a.rtp_stats.fec.packets, b.rtp_stats.fec.packets);
sprang@webrtc.org09315702014-02-07 12:06:29 +000079
80 EXPECT_EQ(a.rtcp_stats.fraction_lost, b.rtcp_stats.fraction_lost);
81 EXPECT_EQ(a.rtcp_stats.cumulative_lost, b.rtcp_stats.cumulative_lost);
82 EXPECT_EQ(a.rtcp_stats.extended_max_sequence_number,
83 b.rtcp_stats.extended_max_sequence_number);
84 EXPECT_EQ(a.rtcp_stats.jitter, b.rtcp_stats.jitter);
85 }
86 }
87
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000088 rtc::scoped_ptr<SendStatisticsProxy> statistics_proxy_;
pbos@webrtc.org273a4142014-12-01 15:23:21 +000089 SimulatedClock fake_clock_;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000090 VideoSendStream::Config config_;
91 int avg_delay_ms_;
92 int max_delay_ms_;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000093 VideoSendStream::Stats expected_;
pbos@webrtc.org09c77b92015-02-25 10:42:16 +000094 typedef std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator
95 StreamIterator;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000096};
97
98TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
99 RtcpStatisticsCallback* callback = statistics_proxy_.get();
100 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
101 it != config_.rtp.ssrcs.end();
102 ++it) {
103 const uint32_t ssrc = *it;
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000104 VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000105
106 // Add statistics with some arbitrary, but unique, numbers.
107 uint32_t offset = ssrc * sizeof(RtcpStatistics);
108 ssrc_stats.rtcp_stats.cumulative_lost = offset;
109 ssrc_stats.rtcp_stats.extended_max_sequence_number = offset + 1;
110 ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
111 ssrc_stats.rtcp_stats.jitter = offset + 3;
112 callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
113 }
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000114 for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin();
115 it != config_.rtp.rtx.ssrcs.end();
116 ++it) {
117 const uint32_t ssrc = *it;
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000118 VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000119
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000120 // Add statistics with some arbitrary, but unique, numbers.
121 uint32_t offset = ssrc * sizeof(RtcpStatistics);
122 ssrc_stats.rtcp_stats.cumulative_lost = offset;
123 ssrc_stats.rtcp_stats.extended_max_sequence_number = offset + 1;
124 ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
125 ssrc_stats.rtcp_stats.jitter = offset + 3;
126 callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
127 }
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000128 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29 +0000129 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000130}
131
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000132TEST_F(SendStatisticsProxyTest, EncodedBitrateAndFramerate) {
Peter Boström7083e112015-09-22 16:28:51 +0200133 int media_bitrate_bps = 500;
134 int encode_fps = 29;
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000135
Peter Boström7083e112015-09-22 16:28:51 +0200136 statistics_proxy_->OnOutgoingRate(encode_fps, media_bitrate_bps);
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000137
138 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
139 EXPECT_EQ(media_bitrate_bps, stats.media_bitrate_bps);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000140 EXPECT_EQ(encode_fps, stats.encode_frame_rate);
141}
142
henrik.lundin@webrtc.orgb10363f2014-03-13 13:31:21 +0000143TEST_F(SendStatisticsProxyTest, Suspended) {
144 // Verify that the value is false by default.
145 EXPECT_FALSE(statistics_proxy_->GetStats().suspended);
146
147 // Verify that we can set it to true.
Peter Boström7083e112015-09-22 16:28:51 +0200148 statistics_proxy_->OnSuspendChange(true);
henrik.lundin@webrtc.orgb10363f2014-03-13 13:31:21 +0000149 EXPECT_TRUE(statistics_proxy_->GetStats().suspended);
150
151 // Verify that we can set it back to false again.
Peter Boström7083e112015-09-22 16:28:51 +0200152 statistics_proxy_->OnSuspendChange(false);
henrik.lundin@webrtc.orgb10363f2014-03-13 13:31:21 +0000153 EXPECT_FALSE(statistics_proxy_->GetStats().suspended);
154}
155
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000156TEST_F(SendStatisticsProxyTest, FrameCounts) {
157 FrameCountObserver* observer = statistics_proxy_.get();
158 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
159 it != config_.rtp.ssrcs.end();
160 ++it) {
161 const uint32_t ssrc = *it;
162 // Add statistics with some arbitrary, but unique, numbers.
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000163 VideoSendStream::StreamStats& stats = expected_.substreams[ssrc];
164 uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000165 FrameCounts frame_counts;
166 frame_counts.key_frames = offset;
167 frame_counts.delta_frames = offset + 1;
168 stats.frame_counts = frame_counts;
169 observer->FrameCountUpdated(frame_counts, ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000170 }
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000171 for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin();
172 it != config_.rtp.rtx.ssrcs.end();
173 ++it) {
174 const uint32_t ssrc = *it;
175 // Add statistics with some arbitrary, but unique, numbers.
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000176 VideoSendStream::StreamStats& stats = expected_.substreams[ssrc];
177 uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000178 FrameCounts frame_counts;
179 frame_counts.key_frames = offset;
180 frame_counts.delta_frames = offset + 1;
181 stats.frame_counts = frame_counts;
182 observer->FrameCountUpdated(frame_counts, ssrc);
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000183 }
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000184
185 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29 +0000186 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000187}
188
189TEST_F(SendStatisticsProxyTest, DataCounters) {
190 StreamDataCountersCallback* callback = statistics_proxy_.get();
191 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
192 it != config_.rtp.ssrcs.end();
193 ++it) {
194 const uint32_t ssrc = *it;
195 StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats;
196 // Add statistics with some arbitrary, but unique, numbers.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000197 size_t offset = ssrc * sizeof(StreamDataCounters);
198 uint32_t offset_uint32 = static_cast<uint32_t>(offset);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000199 counters.transmitted.payload_bytes = offset;
200 counters.transmitted.header_bytes = offset + 1;
201 counters.fec.packets = offset_uint32 + 2;
202 counters.transmitted.padding_bytes = offset + 3;
203 counters.retransmitted.packets = offset_uint32 + 4;
204 counters.transmitted.packets = offset_uint32 + 5;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000205 callback->DataCountersUpdated(counters, ssrc);
206 }
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000207 for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin();
208 it != config_.rtp.rtx.ssrcs.end();
209 ++it) {
210 const uint32_t ssrc = *it;
211 StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats;
212 // Add statistics with some arbitrary, but unique, numbers.
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000213 size_t offset = ssrc * sizeof(StreamDataCounters);
214 uint32_t offset_uint32 = static_cast<uint32_t>(offset);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000215 counters.transmitted.payload_bytes = offset;
216 counters.transmitted.header_bytes = offset + 1;
217 counters.fec.packets = offset_uint32 + 2;
218 counters.transmitted.padding_bytes = offset + 3;
219 counters.retransmitted.packets = offset_uint32 + 4;
220 counters.transmitted.packets = offset_uint32 + 5;
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000221 callback->DataCountersUpdated(counters, ssrc);
222 }
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000223
224 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29 +0000225 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000226}
227
228TEST_F(SendStatisticsProxyTest, Bitrate) {
229 BitrateStatisticsObserver* observer = statistics_proxy_.get();
230 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
231 it != config_.rtp.ssrcs.end();
232 ++it) {
233 const uint32_t ssrc = *it;
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000234 BitrateStatistics total;
235 BitrateStatistics retransmit;
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000236 // Use ssrc as bitrate_bps to get a unique value for each stream.
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000237 total.bitrate_bps = ssrc;
238 retransmit.bitrate_bps = ssrc + 1;
239 observer->Notify(total, retransmit, ssrc);
240 expected_.substreams[ssrc].total_bitrate_bps = total.bitrate_bps;
241 expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit.bitrate_bps;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000242 }
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000243 for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin();
244 it != config_.rtp.rtx.ssrcs.end();
245 ++it) {
246 const uint32_t ssrc = *it;
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000247 BitrateStatistics total;
248 BitrateStatistics retransmit;
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000249 // Use ssrc as bitrate_bps to get a unique value for each stream.
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000250 total.bitrate_bps = ssrc;
251 retransmit.bitrate_bps = ssrc + 1;
252 observer->Notify(total, retransmit, ssrc);
253 expected_.substreams[ssrc].total_bitrate_bps = total.bitrate_bps;
254 expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit.bitrate_bps;
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000255 }
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000256
257 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
sprang@webrtc.org09315702014-02-07 12:06:29 +0000258 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000259}
260
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000261TEST_F(SendStatisticsProxyTest, SendSideDelay) {
262 SendSideDelayObserver* observer = statistics_proxy_.get();
263 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
264 it != config_.rtp.ssrcs.end();
265 ++it) {
266 const uint32_t ssrc = *it;
267 // Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each
268 // stream.
269 int avg_delay_ms = ssrc;
270 int max_delay_ms = ssrc + 1;
271 observer->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
272 expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms;
273 expected_.substreams[ssrc].max_delay_ms = max_delay_ms;
274 }
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000275 for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin();
276 it != config_.rtp.rtx.ssrcs.end();
277 ++it) {
278 const uint32_t ssrc = *it;
279 // Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each
280 // stream.
281 int avg_delay_ms = ssrc;
282 int max_delay_ms = ssrc + 1;
283 observer->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
284 expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms;
285 expected_.substreams[ssrc].max_delay_ms = max_delay_ms;
286 }
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000287 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000288 ExpectEqual(expected_, stats);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000289}
290
291TEST_F(SendStatisticsProxyTest, NoSubstreams) {
pbos@webrtc.org49096de2015-02-24 22:37:52 +0000292 uint32_t excluded_ssrc =
stefan@webrtc.org58e2d262014-08-14 15:10:49 +0000293 std::max(
294 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()),
295 *std::max_element(config_.rtp.rtx.ssrcs.begin(),
296 config_.rtp.rtx.ssrcs.end())) +
297 1;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000298 // From RtcpStatisticsCallback.
299 RtcpStatistics rtcp_stats;
300 RtcpStatisticsCallback* rtcp_callback = statistics_proxy_.get();
pbos@webrtc.org49096de2015-02-24 22:37:52 +0000301 rtcp_callback->StatisticsUpdated(rtcp_stats, excluded_ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000302
303 // From BitrateStatisticsObserver.
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000304 BitrateStatistics total;
305 BitrateStatistics retransmit;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000306 BitrateStatisticsObserver* bitrate_observer = statistics_proxy_.get();
pbos@webrtc.org49096de2015-02-24 22:37:52 +0000307 bitrate_observer->Notify(total, retransmit, excluded_ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000308
309 // From FrameCountObserver.
310 FrameCountObserver* fps_observer = statistics_proxy_.get();
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000311 FrameCounts frame_counts;
312 frame_counts.key_frames = 1;
pbos@webrtc.org49096de2015-02-24 22:37:52 +0000313 fps_observer->FrameCountUpdated(frame_counts, excluded_ssrc);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000314
315 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
316 EXPECT_TRUE(stats.substreams.empty());
317}
318
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000319TEST_F(SendStatisticsProxyTest, EncodedResolutionTimesOut) {
320 static const int kEncodedWidth = 123;
321 static const int kEncodedHeight = 81;
322 EncodedImage encoded_image;
323 encoded_image._encodedWidth = kEncodedWidth;
324 encoded_image._encodedHeight = kEncodedHeight;
325
326 RTPVideoHeader rtp_video_header;
327
328 rtp_video_header.simulcastIdx = 0;
329 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header);
330 rtp_video_header.simulcastIdx = 1;
331 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header);
332
333 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000334 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
335 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
336 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width);
337 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height);
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000338
339 // Forward almost to timeout, this should not have removed stats.
340 fake_clock_.AdvanceTimeMilliseconds(SendStatisticsProxy::kStatsTimeoutMs - 1);
341 stats = statistics_proxy_->GetStats();
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000342 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
343 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000344
345 // Update the first SSRC with bogus RTCP stats to make sure that encoded
346 // resolution still times out (no global timeout for all stats).
347 RtcpStatistics rtcp_statistics;
348 RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get();
349 rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]);
350
351 // Report stats for second SSRC to make sure it's not outdated along with the
352 // first SSRC.
353 rtp_video_header.simulcastIdx = 1;
354 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header);
355
356 // Forward 1 ms, reach timeout, substream 0 should have no resolution
357 // reported, but substream 1 should.
358 fake_clock_.AdvanceTimeMilliseconds(1);
359 stats = statistics_proxy_->GetStats();
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000360 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].width);
361 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].height);
362 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width);
363 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height);
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000364}
365
Peter Boström20f3f942015-05-15 11:33:39 +0200366TEST_F(SendStatisticsProxyTest, ClearsResolutionFromInactiveSsrcs) {
367 static const int kEncodedWidth = 123;
368 static const int kEncodedHeight = 81;
369 EncodedImage encoded_image;
370 encoded_image._encodedWidth = kEncodedWidth;
371 encoded_image._encodedHeight = kEncodedHeight;
372
373 RTPVideoHeader rtp_video_header;
374
375 rtp_video_header.simulcastIdx = 0;
376 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header);
377 rtp_video_header.simulcastIdx = 1;
378 statistics_proxy_->OnSendEncodedImage(encoded_image, &rtp_video_header);
379
380 statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]);
381 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
382 EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
383 EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
384 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].width);
385 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].height);
386}
387
388TEST_F(SendStatisticsProxyTest, ClearsBitratesFromInactiveSsrcs) {
389 BitrateStatistics bitrate;
390 bitrate.bitrate_bps = 42;
391 BitrateStatisticsObserver* observer = statistics_proxy_.get();
392 observer->Notify(bitrate, bitrate, config_.rtp.ssrcs[0]);
393 observer->Notify(bitrate, bitrate, config_.rtp.ssrcs[1]);
394
395 statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]);
396
397 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
398 EXPECT_EQ(static_cast<int>(bitrate.bitrate_bps),
399 stats.substreams[config_.rtp.ssrcs[0]].total_bitrate_bps);
400 EXPECT_EQ(static_cast<int>(bitrate.bitrate_bps),
401 stats.substreams[config_.rtp.ssrcs[0]].retransmit_bitrate_bps);
402 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].total_bitrate_bps);
403 EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].retransmit_bitrate_bps);
404}
405
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000406} // namespace webrtc