OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/ref_counted.h" | 5 #include "base/memory/ref_counted.h" |
6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
7 #include "base/rand_util.h" | 7 #include "base/rand_util.h" |
8 #include "base/test/simple_test_tick_clock.h" | 8 #include "base/test/simple_test_tick_clock.h" |
9 #include "base/time/tick_clock.h" | 9 #include "base/time/tick_clock.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 base::SimpleTestTickClock receiver_clock_; | 60 base::SimpleTestTickClock receiver_clock_; |
61 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 61 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
62 scoped_refptr<CastEnvironment> cast_environment_; | 62 scoped_refptr<CastEnvironment> cast_environment_; |
63 test::FakeReceiverTimeOffsetEstimator fake_offset_estimator_; | 63 test::FakeReceiverTimeOffsetEstimator fake_offset_estimator_; |
64 scoped_ptr<StatsEventSubscriber> subscriber_; | 64 scoped_ptr<StatsEventSubscriber> subscriber_; |
65 }; | 65 }; |
66 | 66 |
67 TEST_F(StatsEventSubscriberTest, CaptureEncode) { | 67 TEST_F(StatsEventSubscriberTest, CaptureEncode) { |
68 Init(VIDEO_EVENT); | 68 Init(VIDEO_EVENT); |
69 | 69 |
70 uint32 rtp_timestamp = 0; | 70 uint32_t rtp_timestamp = 0; |
71 uint32 frame_id = 0; | 71 uint32_t frame_id = 0; |
72 int extra_frames = 50; | 72 int extra_frames = 50; |
73 // Only the first |extra_frames| frames logged will be taken into account | 73 // Only the first |extra_frames| frames logged will be taken into account |
74 // when computing dropped frames. | 74 // when computing dropped frames. |
75 int num_frames = StatsEventSubscriber::kMaxFrameInfoMapSize + 50; | 75 int num_frames = StatsEventSubscriber::kMaxFrameInfoMapSize + 50; |
76 int dropped_frames = 0; | 76 int dropped_frames = 0; |
77 base::TimeTicks start_time = sender_clock_->NowTicks(); | 77 base::TimeTicks start_time = sender_clock_->NowTicks(); |
78 // Drop half the frames during the encode step. | 78 // Drop half the frames during the encode step. |
79 for (int i = 0; i < num_frames; i++) { | 79 for (int i = 0; i < num_frames; i++) { |
80 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); | 80 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); |
81 capture_begin_event->timestamp = sender_clock_->NowTicks(); | 81 capture_begin_event->timestamp = sender_clock_->NowTicks(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 | 140 |
141 it = stats_map.find(StatsEventSubscriber::AVG_CAPTURE_LATENCY_MS); | 141 it = stats_map.find(StatsEventSubscriber::AVG_CAPTURE_LATENCY_MS); |
142 ASSERT_TRUE(it != stats_map.end()); | 142 ASSERT_TRUE(it != stats_map.end()); |
143 | 143 |
144 EXPECT_DOUBLE_EQ(it->second, static_cast<double>(0.01)); | 144 EXPECT_DOUBLE_EQ(it->second, static_cast<double>(0.01)); |
145 } | 145 } |
146 | 146 |
147 TEST_F(StatsEventSubscriberTest, Encode) { | 147 TEST_F(StatsEventSubscriberTest, Encode) { |
148 Init(VIDEO_EVENT); | 148 Init(VIDEO_EVENT); |
149 | 149 |
150 uint32 rtp_timestamp = 0; | 150 uint32_t rtp_timestamp = 0; |
151 uint32 frame_id = 0; | 151 uint32_t frame_id = 0; |
152 int num_frames = 10; | 152 int num_frames = 10; |
153 base::TimeTicks start_time = sender_clock_->NowTicks(); | 153 base::TimeTicks start_time = sender_clock_->NowTicks(); |
154 AdvanceClocks(base::TimeDelta::FromMicroseconds(35678)); | 154 AdvanceClocks(base::TimeDelta::FromMicroseconds(35678)); |
155 base::TimeTicks first_event_time = sender_clock_->NowTicks(); | 155 base::TimeTicks first_event_time = sender_clock_->NowTicks(); |
156 base::TimeTicks last_event_time; | 156 base::TimeTicks last_event_time; |
157 int total_size = 0; | 157 int total_size = 0; |
158 for (int i = 0; i < num_frames; i++) { | 158 for (int i = 0; i < num_frames; i++) { |
159 int size = 1000 + base::RandInt(-100, 100); | 159 int size = 1000 + base::RandInt(-100, 100); |
160 total_size += size; | 160 total_size += size; |
161 scoped_ptr<FrameEvent> encode_event(new FrameEvent()); | 161 scoped_ptr<FrameEvent> encode_event(new FrameEvent()); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 ASSERT_TRUE(it != stats_map.end()); | 208 ASSERT_TRUE(it != stats_map.end()); |
209 | 209 |
210 EXPECT_DOUBLE_EQ( | 210 EXPECT_DOUBLE_EQ( |
211 it->second, | 211 it->second, |
212 (last_event_time - base::TimeTicks::UnixEpoch()).InMillisecondsF()); | 212 (last_event_time - base::TimeTicks::UnixEpoch()).InMillisecondsF()); |
213 } | 213 } |
214 | 214 |
215 TEST_F(StatsEventSubscriberTest, Decode) { | 215 TEST_F(StatsEventSubscriberTest, Decode) { |
216 Init(VIDEO_EVENT); | 216 Init(VIDEO_EVENT); |
217 | 217 |
218 uint32 rtp_timestamp = 0; | 218 uint32_t rtp_timestamp = 0; |
219 uint32 frame_id = 0; | 219 uint32_t frame_id = 0; |
220 int num_frames = 10; | 220 int num_frames = 10; |
221 base::TimeTicks start_time = sender_clock_->NowTicks(); | 221 base::TimeTicks start_time = sender_clock_->NowTicks(); |
222 for (int i = 0; i < num_frames; i++) { | 222 for (int i = 0; i < num_frames; i++) { |
223 scoped_ptr<FrameEvent> decode_event(new FrameEvent()); | 223 scoped_ptr<FrameEvent> decode_event(new FrameEvent()); |
224 decode_event->timestamp = receiver_clock_.NowTicks(); | 224 decode_event->timestamp = receiver_clock_.NowTicks(); |
225 decode_event->type = FRAME_DECODED; | 225 decode_event->type = FRAME_DECODED; |
226 decode_event->media_type = VIDEO_EVENT; | 226 decode_event->media_type = VIDEO_EVENT; |
227 decode_event->rtp_timestamp = rtp_timestamp; | 227 decode_event->rtp_timestamp = rtp_timestamp; |
228 decode_event->frame_id = frame_id; | 228 decode_event->frame_id = frame_id; |
229 cast_environment_->logger()->DispatchFrameEvent(decode_event.Pass()); | 229 cast_environment_->logger()->DispatchFrameEvent(decode_event.Pass()); |
(...skipping 14 matching lines...) Expand all Loading... |
244 | 244 |
245 base::TimeDelta duration = end_time - start_time; | 245 base::TimeDelta duration = end_time - start_time; |
246 EXPECT_DOUBLE_EQ( | 246 EXPECT_DOUBLE_EQ( |
247 it->second, | 247 it->second, |
248 static_cast<double>(num_frames) / duration.InMillisecondsF() * 1000); | 248 static_cast<double>(num_frames) / duration.InMillisecondsF() * 1000); |
249 } | 249 } |
250 | 250 |
251 TEST_F(StatsEventSubscriberTest, PlayoutDelay) { | 251 TEST_F(StatsEventSubscriberTest, PlayoutDelay) { |
252 Init(VIDEO_EVENT); | 252 Init(VIDEO_EVENT); |
253 | 253 |
254 uint32 rtp_timestamp = 0; | 254 uint32_t rtp_timestamp = 0; |
255 uint32 frame_id = 0; | 255 uint32_t frame_id = 0; |
256 int num_frames = 10; | 256 int num_frames = 10; |
257 int late_frames = 0; | 257 int late_frames = 0; |
258 for (int i = 0, delay_ms = -50; i < num_frames; i++, delay_ms += 10) { | 258 for (int i = 0, delay_ms = -50; i < num_frames; i++, delay_ms += 10) { |
259 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_ms); | 259 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_ms); |
260 if (delay_ms > 0) | 260 if (delay_ms > 0) |
261 late_frames++; | 261 late_frames++; |
262 scoped_ptr<FrameEvent> playout_event(new FrameEvent()); | 262 scoped_ptr<FrameEvent> playout_event(new FrameEvent()); |
263 playout_event->timestamp = receiver_clock_.NowTicks(); | 263 playout_event->timestamp = receiver_clock_.NowTicks(); |
264 playout_event->type = FRAME_PLAYOUT; | 264 playout_event->type = FRAME_PLAYOUT; |
265 playout_event->media_type = VIDEO_EVENT; | 265 playout_event->media_type = VIDEO_EVENT; |
(...skipping 13 matching lines...) Expand all Loading... |
279 StatsEventSubscriber::StatsMap::iterator it = stats_map.find( | 279 StatsEventSubscriber::StatsMap::iterator it = stats_map.find( |
280 StatsEventSubscriber::NUM_FRAMES_LATE); | 280 StatsEventSubscriber::NUM_FRAMES_LATE); |
281 ASSERT_TRUE(it != stats_map.end()); | 281 ASSERT_TRUE(it != stats_map.end()); |
282 | 282 |
283 EXPECT_DOUBLE_EQ(it->second, late_frames); | 283 EXPECT_DOUBLE_EQ(it->second, late_frames); |
284 } | 284 } |
285 | 285 |
286 TEST_F(StatsEventSubscriberTest, E2ELatency) { | 286 TEST_F(StatsEventSubscriberTest, E2ELatency) { |
287 Init(VIDEO_EVENT); | 287 Init(VIDEO_EVENT); |
288 | 288 |
289 uint32 rtp_timestamp = 0; | 289 uint32_t rtp_timestamp = 0; |
290 uint32 frame_id = 0; | 290 uint32_t frame_id = 0; |
291 int num_frames = 10; | 291 int num_frames = 10; |
292 base::TimeDelta total_latency; | 292 base::TimeDelta total_latency; |
293 for (int i = 0; i < num_frames; i++) { | 293 for (int i = 0; i < num_frames; i++) { |
294 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); | 294 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); |
295 capture_begin_event->timestamp = sender_clock_->NowTicks(); | 295 capture_begin_event->timestamp = sender_clock_->NowTicks(); |
296 capture_begin_event->type = FRAME_CAPTURE_BEGIN; | 296 capture_begin_event->type = FRAME_CAPTURE_BEGIN; |
297 capture_begin_event->media_type = VIDEO_EVENT; | 297 capture_begin_event->media_type = VIDEO_EVENT; |
298 capture_begin_event->rtp_timestamp = rtp_timestamp; | 298 capture_begin_event->rtp_timestamp = rtp_timestamp; |
299 cast_environment_->logger()->DispatchFrameEvent(capture_begin_event.Pass()); | 299 cast_environment_->logger()->DispatchFrameEvent(capture_begin_event.Pass()); |
300 | 300 |
(...skipping 25 matching lines...) Expand all Loading... |
326 stats_map.find(StatsEventSubscriber::AVG_E2E_LATENCY_MS); | 326 stats_map.find(StatsEventSubscriber::AVG_E2E_LATENCY_MS); |
327 ASSERT_TRUE(it != stats_map.end()); | 327 ASSERT_TRUE(it != stats_map.end()); |
328 | 328 |
329 EXPECT_DOUBLE_EQ( | 329 EXPECT_DOUBLE_EQ( |
330 it->second, total_latency.InMillisecondsF() / num_frames); | 330 it->second, total_latency.InMillisecondsF() / num_frames); |
331 } | 331 } |
332 | 332 |
333 TEST_F(StatsEventSubscriberTest, Packets) { | 333 TEST_F(StatsEventSubscriberTest, Packets) { |
334 Init(VIDEO_EVENT); | 334 Init(VIDEO_EVENT); |
335 | 335 |
336 uint32 rtp_timestamp = 0; | 336 uint32_t rtp_timestamp = 0; |
337 int num_packets = 10; | 337 int num_packets = 10; |
338 int num_latency_recorded_packets = 0; | 338 int num_latency_recorded_packets = 0; |
339 base::TimeTicks start_time = sender_clock_->NowTicks(); | 339 base::TimeTicks start_time = sender_clock_->NowTicks(); |
340 int total_size = 0; | 340 int total_size = 0; |
341 int retransmit_total_size = 0; | 341 int retransmit_total_size = 0; |
342 base::TimeDelta total_network_latency; | 342 base::TimeDelta total_network_latency; |
343 base::TimeDelta total_queueing_latency; | 343 base::TimeDelta total_queueing_latency; |
344 base::TimeDelta total_packet_latency; | 344 base::TimeDelta total_packet_latency; |
345 int num_packets_transmitted = 0; | 345 int num_packets_transmitted = 0; |
346 int num_packets_received = 0; | 346 int num_packets_received = 0; |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 return false; | 550 return false; |
551 return bucket_count == expected_count; | 551 return bucket_count == expected_count; |
552 } | 552 } |
553 return false; | 553 return false; |
554 } | 554 } |
555 | 555 |
556 TEST_F(StatsEventSubscriberTest, Histograms) { | 556 TEST_F(StatsEventSubscriberTest, Histograms) { |
557 Init(VIDEO_EVENT); | 557 Init(VIDEO_EVENT); |
558 AdvanceClocks(base::TimeDelta::FromMilliseconds(123)); | 558 AdvanceClocks(base::TimeDelta::FromMilliseconds(123)); |
559 | 559 |
560 uint32 rtp_timestamp = 123; | 560 uint32_t rtp_timestamp = 123; |
561 uint32 frame_id = 0; | 561 uint32_t frame_id = 0; |
562 | 562 |
563 // 10 Frames with capture latency in the bucket of "10-14"ms. | 563 // 10 Frames with capture latency in the bucket of "10-14"ms. |
564 // 10 Frames with encode time in the bucket of "15-19"ms. | 564 // 10 Frames with encode time in the bucket of "15-19"ms. |
565 for (int i = 0; i < 10; ++i) { | 565 for (int i = 0; i < 10; ++i) { |
566 ++frame_id; | 566 ++frame_id; |
567 ++rtp_timestamp; | 567 ++rtp_timestamp; |
568 | 568 |
569 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); | 569 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); |
570 capture_begin_event->timestamp = sender_clock_->NowTicks(); | 570 capture_begin_event->timestamp = sender_clock_->NowTicks(); |
571 capture_begin_event->type = FRAME_CAPTURE_BEGIN; | 571 capture_begin_event->type = FRAME_CAPTURE_BEGIN; |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 | 677 |
678 histogram = subscriber_->GetHistogramForTesting( | 678 histogram = subscriber_->GetHistogramForTesting( |
679 StatsEventSubscriber::LATE_FRAME_MS_HISTO); | 679 StatsEventSubscriber::LATE_FRAME_MS_HISTO); |
680 ASSERT_TRUE(histogram); | 680 ASSERT_TRUE(histogram); |
681 values = histogram->GetHistogram().Pass(); | 681 values = histogram->GetHistogram().Pass(); |
682 EXPECT_TRUE(CheckHistogramHasValue(values.get(), "100-119", 1)); | 682 EXPECT_TRUE(CheckHistogramHasValue(values.get(), "100-119", 1)); |
683 } | 683 } |
684 | 684 |
685 } // namespace cast | 685 } // namespace cast |
686 } // namespace media | 686 } // namespace media |
OLD | NEW |