| 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 "media/cast/logging/stats_event_subscriber.h" | 5 #include "media/cast/logging/stats_event_subscriber.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 |
| 10 #include <memory> |
| 9 #include <utility> | 11 #include <utility> |
| 10 | 12 |
| 11 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 12 #include "base/memory/scoped_ptr.h" | |
| 13 #include "base/rand_util.h" | 14 #include "base/rand_util.h" |
| 14 #include "base/test/simple_test_tick_clock.h" | 15 #include "base/test/simple_test_tick_clock.h" |
| 15 #include "base/time/tick_clock.h" | 16 #include "base/time/tick_clock.h" |
| 16 #include "base/values.h" | 17 #include "base/values.h" |
| 17 #include "media/base/fake_single_thread_task_runner.h" | 18 #include "media/base/fake_single_thread_task_runner.h" |
| 18 #include "media/cast/cast_environment.h" | 19 #include "media/cast/cast_environment.h" |
| 19 #include "media/cast/logging/logging_defines.h" | 20 #include "media/cast/logging/logging_defines.h" |
| 20 #include "media/cast/test/fake_receiver_time_offset_estimator.h" | 21 #include "media/cast/test/fake_receiver_time_offset_estimator.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| 24 const int kReceiverOffsetSecs = 100; | 25 const int kReceiverOffsetSecs = 100; |
| 25 } | 26 } |
| 26 | 27 |
| 27 namespace media { | 28 namespace media { |
| 28 namespace cast { | 29 namespace cast { |
| 29 | 30 |
| 30 class StatsEventSubscriberTest : public ::testing::Test { | 31 class StatsEventSubscriberTest : public ::testing::Test { |
| 31 protected: | 32 protected: |
| 32 StatsEventSubscriberTest() | 33 StatsEventSubscriberTest() |
| 33 : sender_clock_(new base::SimpleTestTickClock()), | 34 : sender_clock_(new base::SimpleTestTickClock()), |
| 34 task_runner_(new FakeSingleThreadTaskRunner(sender_clock_)), | 35 task_runner_(new FakeSingleThreadTaskRunner(sender_clock_)), |
| 35 cast_environment_( | 36 cast_environment_( |
| 36 new CastEnvironment(scoped_ptr<base::TickClock>(sender_clock_), | 37 new CastEnvironment(std::unique_ptr<base::TickClock>(sender_clock_), |
| 37 task_runner_, | 38 task_runner_, |
| 38 task_runner_, | 39 task_runner_, |
| 39 task_runner_)), | 40 task_runner_)), |
| 40 fake_offset_estimator_( | 41 fake_offset_estimator_( |
| 41 base::TimeDelta::FromSeconds(kReceiverOffsetSecs)) { | 42 base::TimeDelta::FromSeconds(kReceiverOffsetSecs)) { |
| 42 receiver_clock_.Advance(base::TimeDelta::FromSeconds(kReceiverOffsetSecs)); | 43 receiver_clock_.Advance(base::TimeDelta::FromSeconds(kReceiverOffsetSecs)); |
| 43 cast_environment_->logger()->Subscribe(&fake_offset_estimator_); | 44 cast_environment_->logger()->Subscribe(&fake_offset_estimator_); |
| 44 } | 45 } |
| 45 | 46 |
| 46 ~StatsEventSubscriberTest() override { | 47 ~StatsEventSubscriberTest() override { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 59 subscriber_.reset(new StatsEventSubscriber( | 60 subscriber_.reset(new StatsEventSubscriber( |
| 60 event_media_type, cast_environment_->Clock(), &fake_offset_estimator_)); | 61 event_media_type, cast_environment_->Clock(), &fake_offset_estimator_)); |
| 61 cast_environment_->logger()->Subscribe(subscriber_.get()); | 62 cast_environment_->logger()->Subscribe(subscriber_.get()); |
| 62 } | 63 } |
| 63 | 64 |
| 64 base::SimpleTestTickClock* sender_clock_; // Owned by CastEnvironment. | 65 base::SimpleTestTickClock* sender_clock_; // Owned by CastEnvironment. |
| 65 base::SimpleTestTickClock receiver_clock_; | 66 base::SimpleTestTickClock receiver_clock_; |
| 66 scoped_refptr<FakeSingleThreadTaskRunner> task_runner_; | 67 scoped_refptr<FakeSingleThreadTaskRunner> task_runner_; |
| 67 scoped_refptr<CastEnvironment> cast_environment_; | 68 scoped_refptr<CastEnvironment> cast_environment_; |
| 68 test::FakeReceiverTimeOffsetEstimator fake_offset_estimator_; | 69 test::FakeReceiverTimeOffsetEstimator fake_offset_estimator_; |
| 69 scoped_ptr<StatsEventSubscriber> subscriber_; | 70 std::unique_ptr<StatsEventSubscriber> subscriber_; |
| 70 }; | 71 }; |
| 71 | 72 |
| 72 TEST_F(StatsEventSubscriberTest, CaptureEncode) { | 73 TEST_F(StatsEventSubscriberTest, CaptureEncode) { |
| 73 Init(VIDEO_EVENT); | 74 Init(VIDEO_EVENT); |
| 74 | 75 |
| 75 RtpTimeTicks rtp_timestamp; | 76 RtpTimeTicks rtp_timestamp; |
| 76 uint32_t frame_id = 0; | 77 uint32_t frame_id = 0; |
| 77 int extra_frames = 50; | 78 int extra_frames = 50; |
| 78 // Only the first |extra_frames| frames logged will be taken into account | 79 // Only the first |extra_frames| frames logged will be taken into account |
| 79 // when computing dropped frames. | 80 // when computing dropped frames. |
| 80 int num_frames = StatsEventSubscriber::kMaxFrameInfoMapSize + 50; | 81 int num_frames = StatsEventSubscriber::kMaxFrameInfoMapSize + 50; |
| 81 int dropped_frames = 0; | 82 int dropped_frames = 0; |
| 82 base::TimeTicks start_time = sender_clock_->NowTicks(); | 83 base::TimeTicks start_time = sender_clock_->NowTicks(); |
| 83 // Drop half the frames during the encode step. | 84 // Drop half the frames during the encode step. |
| 84 for (int i = 0; i < num_frames; i++) { | 85 for (int i = 0; i < num_frames; i++) { |
| 85 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); | 86 std::unique_ptr<FrameEvent> capture_begin_event(new FrameEvent()); |
| 86 capture_begin_event->timestamp = sender_clock_->NowTicks(); | 87 capture_begin_event->timestamp = sender_clock_->NowTicks(); |
| 87 capture_begin_event->type = FRAME_CAPTURE_BEGIN; | 88 capture_begin_event->type = FRAME_CAPTURE_BEGIN; |
| 88 capture_begin_event->media_type = VIDEO_EVENT; | 89 capture_begin_event->media_type = VIDEO_EVENT; |
| 89 capture_begin_event->rtp_timestamp = rtp_timestamp; | 90 capture_begin_event->rtp_timestamp = rtp_timestamp; |
| 90 cast_environment_->logger()->DispatchFrameEvent( | 91 cast_environment_->logger()->DispatchFrameEvent( |
| 91 std::move(capture_begin_event)); | 92 std::move(capture_begin_event)); |
| 92 | 93 |
| 93 AdvanceClocks(base::TimeDelta::FromMicroseconds(10)); | 94 AdvanceClocks(base::TimeDelta::FromMicroseconds(10)); |
| 94 scoped_ptr<FrameEvent> capture_end_event(new FrameEvent()); | 95 std::unique_ptr<FrameEvent> capture_end_event(new FrameEvent()); |
| 95 capture_end_event->timestamp = sender_clock_->NowTicks(); | 96 capture_end_event->timestamp = sender_clock_->NowTicks(); |
| 96 capture_end_event->type = FRAME_CAPTURE_END; | 97 capture_end_event->type = FRAME_CAPTURE_END; |
| 97 capture_end_event->media_type = VIDEO_EVENT; | 98 capture_end_event->media_type = VIDEO_EVENT; |
| 98 capture_end_event->rtp_timestamp = rtp_timestamp; | 99 capture_end_event->rtp_timestamp = rtp_timestamp; |
| 99 cast_environment_->logger()->DispatchFrameEvent( | 100 cast_environment_->logger()->DispatchFrameEvent( |
| 100 std::move(capture_end_event)); | 101 std::move(capture_end_event)); |
| 101 | 102 |
| 102 if (i % 2 == 0) { | 103 if (i % 2 == 0) { |
| 103 AdvanceClocks(base::TimeDelta::FromMicroseconds(10)); | 104 AdvanceClocks(base::TimeDelta::FromMicroseconds(10)); |
| 104 scoped_ptr<FrameEvent> encode_event(new FrameEvent()); | 105 std::unique_ptr<FrameEvent> encode_event(new FrameEvent()); |
| 105 encode_event->timestamp = sender_clock_->NowTicks(); | 106 encode_event->timestamp = sender_clock_->NowTicks(); |
| 106 encode_event->type = FRAME_ENCODED; | 107 encode_event->type = FRAME_ENCODED; |
| 107 encode_event->media_type = VIDEO_EVENT; | 108 encode_event->media_type = VIDEO_EVENT; |
| 108 encode_event->rtp_timestamp = rtp_timestamp; | 109 encode_event->rtp_timestamp = rtp_timestamp; |
| 109 encode_event->frame_id = frame_id; | 110 encode_event->frame_id = frame_id; |
| 110 encode_event->size = 1024; | 111 encode_event->size = 1024; |
| 111 encode_event->key_frame = true; | 112 encode_event->key_frame = true; |
| 112 encode_event->target_bitrate = 5678; | 113 encode_event->target_bitrate = 5678; |
| 113 encode_event->encoder_cpu_utilization = 9.10; | 114 encode_event->encoder_cpu_utilization = 9.10; |
| 114 encode_event->idealized_bitrate_utilization = 11.12; | 115 encode_event->idealized_bitrate_utilization = 11.12; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 uint32_t frame_id = 0; | 159 uint32_t frame_id = 0; |
| 159 int num_frames = 10; | 160 int num_frames = 10; |
| 160 base::TimeTicks start_time = sender_clock_->NowTicks(); | 161 base::TimeTicks start_time = sender_clock_->NowTicks(); |
| 161 AdvanceClocks(base::TimeDelta::FromMicroseconds(35678)); | 162 AdvanceClocks(base::TimeDelta::FromMicroseconds(35678)); |
| 162 base::TimeTicks first_event_time = sender_clock_->NowTicks(); | 163 base::TimeTicks first_event_time = sender_clock_->NowTicks(); |
| 163 base::TimeTicks last_event_time; | 164 base::TimeTicks last_event_time; |
| 164 int total_size = 0; | 165 int total_size = 0; |
| 165 for (int i = 0; i < num_frames; i++) { | 166 for (int i = 0; i < num_frames; i++) { |
| 166 int size = 1000 + base::RandInt(-100, 100); | 167 int size = 1000 + base::RandInt(-100, 100); |
| 167 total_size += size; | 168 total_size += size; |
| 168 scoped_ptr<FrameEvent> encode_event(new FrameEvent()); | 169 std::unique_ptr<FrameEvent> encode_event(new FrameEvent()); |
| 169 encode_event->timestamp = sender_clock_->NowTicks(); | 170 encode_event->timestamp = sender_clock_->NowTicks(); |
| 170 encode_event->type = FRAME_ENCODED; | 171 encode_event->type = FRAME_ENCODED; |
| 171 encode_event->media_type = VIDEO_EVENT; | 172 encode_event->media_type = VIDEO_EVENT; |
| 172 encode_event->rtp_timestamp = rtp_timestamp; | 173 encode_event->rtp_timestamp = rtp_timestamp; |
| 173 encode_event->frame_id = frame_id; | 174 encode_event->frame_id = frame_id; |
| 174 encode_event->size = size; | 175 encode_event->size = size; |
| 175 encode_event->key_frame = true; | 176 encode_event->key_frame = true; |
| 176 encode_event->target_bitrate = 5678; | 177 encode_event->target_bitrate = 5678; |
| 177 encode_event->encoder_cpu_utilization = 9.10; | 178 encode_event->encoder_cpu_utilization = 9.10; |
| 178 encode_event->idealized_bitrate_utilization = 11.12; | 179 encode_event->idealized_bitrate_utilization = 11.12; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 221 } |
| 221 | 222 |
| 222 TEST_F(StatsEventSubscriberTest, Decode) { | 223 TEST_F(StatsEventSubscriberTest, Decode) { |
| 223 Init(VIDEO_EVENT); | 224 Init(VIDEO_EVENT); |
| 224 | 225 |
| 225 RtpTimeTicks rtp_timestamp; | 226 RtpTimeTicks rtp_timestamp; |
| 226 uint32_t frame_id = 0; | 227 uint32_t frame_id = 0; |
| 227 int num_frames = 10; | 228 int num_frames = 10; |
| 228 base::TimeTicks start_time = sender_clock_->NowTicks(); | 229 base::TimeTicks start_time = sender_clock_->NowTicks(); |
| 229 for (int i = 0; i < num_frames; i++) { | 230 for (int i = 0; i < num_frames; i++) { |
| 230 scoped_ptr<FrameEvent> decode_event(new FrameEvent()); | 231 std::unique_ptr<FrameEvent> decode_event(new FrameEvent()); |
| 231 decode_event->timestamp = receiver_clock_.NowTicks(); | 232 decode_event->timestamp = receiver_clock_.NowTicks(); |
| 232 decode_event->type = FRAME_DECODED; | 233 decode_event->type = FRAME_DECODED; |
| 233 decode_event->media_type = VIDEO_EVENT; | 234 decode_event->media_type = VIDEO_EVENT; |
| 234 decode_event->rtp_timestamp = rtp_timestamp; | 235 decode_event->rtp_timestamp = rtp_timestamp; |
| 235 decode_event->frame_id = frame_id; | 236 decode_event->frame_id = frame_id; |
| 236 cast_environment_->logger()->DispatchFrameEvent(std::move(decode_event)); | 237 cast_environment_->logger()->DispatchFrameEvent(std::move(decode_event)); |
| 237 | 238 |
| 238 AdvanceClocks(base::TimeDelta::FromMicroseconds(36789)); | 239 AdvanceClocks(base::TimeDelta::FromMicroseconds(36789)); |
| 239 rtp_timestamp += RtpTimeDelta::FromTicks(90); | 240 rtp_timestamp += RtpTimeDelta::FromTicks(90); |
| 240 frame_id++; | 241 frame_id++; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 259 Init(VIDEO_EVENT); | 260 Init(VIDEO_EVENT); |
| 260 | 261 |
| 261 RtpTimeTicks rtp_timestamp; | 262 RtpTimeTicks rtp_timestamp; |
| 262 uint32_t frame_id = 0; | 263 uint32_t frame_id = 0; |
| 263 int num_frames = 10; | 264 int num_frames = 10; |
| 264 int late_frames = 0; | 265 int late_frames = 0; |
| 265 for (int i = 0, delay_ms = -50; i < num_frames; i++, delay_ms += 10) { | 266 for (int i = 0, delay_ms = -50; i < num_frames; i++, delay_ms += 10) { |
| 266 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_ms); | 267 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_ms); |
| 267 if (delay_ms > 0) | 268 if (delay_ms > 0) |
| 268 late_frames++; | 269 late_frames++; |
| 269 scoped_ptr<FrameEvent> playout_event(new FrameEvent()); | 270 std::unique_ptr<FrameEvent> playout_event(new FrameEvent()); |
| 270 playout_event->timestamp = receiver_clock_.NowTicks(); | 271 playout_event->timestamp = receiver_clock_.NowTicks(); |
| 271 playout_event->type = FRAME_PLAYOUT; | 272 playout_event->type = FRAME_PLAYOUT; |
| 272 playout_event->media_type = VIDEO_EVENT; | 273 playout_event->media_type = VIDEO_EVENT; |
| 273 playout_event->rtp_timestamp = rtp_timestamp; | 274 playout_event->rtp_timestamp = rtp_timestamp; |
| 274 playout_event->frame_id = frame_id; | 275 playout_event->frame_id = frame_id; |
| 275 playout_event->delay_delta = delay; | 276 playout_event->delay_delta = delay; |
| 276 cast_environment_->logger()->DispatchFrameEvent(std::move(playout_event)); | 277 cast_environment_->logger()->DispatchFrameEvent(std::move(playout_event)); |
| 277 | 278 |
| 278 AdvanceClocks(base::TimeDelta::FromMicroseconds(37890)); | 279 AdvanceClocks(base::TimeDelta::FromMicroseconds(37890)); |
| 279 rtp_timestamp += RtpTimeDelta::FromTicks(90); | 280 rtp_timestamp += RtpTimeDelta::FromTicks(90); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 291 } | 292 } |
| 292 | 293 |
| 293 TEST_F(StatsEventSubscriberTest, E2ELatency) { | 294 TEST_F(StatsEventSubscriberTest, E2ELatency) { |
| 294 Init(VIDEO_EVENT); | 295 Init(VIDEO_EVENT); |
| 295 | 296 |
| 296 RtpTimeTicks rtp_timestamp; | 297 RtpTimeTicks rtp_timestamp; |
| 297 uint32_t frame_id = 0; | 298 uint32_t frame_id = 0; |
| 298 int num_frames = 10; | 299 int num_frames = 10; |
| 299 base::TimeDelta total_latency; | 300 base::TimeDelta total_latency; |
| 300 for (int i = 0; i < num_frames; i++) { | 301 for (int i = 0; i < num_frames; i++) { |
| 301 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); | 302 std::unique_ptr<FrameEvent> capture_begin_event(new FrameEvent()); |
| 302 capture_begin_event->timestamp = sender_clock_->NowTicks(); | 303 capture_begin_event->timestamp = sender_clock_->NowTicks(); |
| 303 capture_begin_event->type = FRAME_CAPTURE_BEGIN; | 304 capture_begin_event->type = FRAME_CAPTURE_BEGIN; |
| 304 capture_begin_event->media_type = VIDEO_EVENT; | 305 capture_begin_event->media_type = VIDEO_EVENT; |
| 305 capture_begin_event->rtp_timestamp = rtp_timestamp; | 306 capture_begin_event->rtp_timestamp = rtp_timestamp; |
| 306 cast_environment_->logger()->DispatchFrameEvent( | 307 cast_environment_->logger()->DispatchFrameEvent( |
| 307 std::move(capture_begin_event)); | 308 std::move(capture_begin_event)); |
| 308 | 309 |
| 309 int latency_micros = 100000 + base::RandInt(-5000, 50000); | 310 int latency_micros = 100000 + base::RandInt(-5000, 50000); |
| 310 base::TimeDelta latency = base::TimeDelta::FromMicroseconds(latency_micros); | 311 base::TimeDelta latency = base::TimeDelta::FromMicroseconds(latency_micros); |
| 311 AdvanceClocks(latency); | 312 AdvanceClocks(latency); |
| 312 | 313 |
| 313 int delay_micros = base::RandInt(-50000, 50000); | 314 int delay_micros = base::RandInt(-50000, 50000); |
| 314 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_micros); | 315 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_micros); |
| 315 total_latency += latency; | 316 total_latency += latency; |
| 316 | 317 |
| 317 scoped_ptr<FrameEvent> playout_event(new FrameEvent()); | 318 std::unique_ptr<FrameEvent> playout_event(new FrameEvent()); |
| 318 playout_event->timestamp = receiver_clock_.NowTicks(); | 319 playout_event->timestamp = receiver_clock_.NowTicks(); |
| 319 playout_event->type = FRAME_PLAYOUT; | 320 playout_event->type = FRAME_PLAYOUT; |
| 320 playout_event->media_type = VIDEO_EVENT; | 321 playout_event->media_type = VIDEO_EVENT; |
| 321 playout_event->rtp_timestamp = rtp_timestamp; | 322 playout_event->rtp_timestamp = rtp_timestamp; |
| 322 playout_event->frame_id = frame_id; | 323 playout_event->frame_id = frame_id; |
| 323 playout_event->delay_delta = delay; | 324 playout_event->delay_delta = delay; |
| 324 cast_environment_->logger()->DispatchFrameEvent(std::move(playout_event)); | 325 cast_environment_->logger()->DispatchFrameEvent(std::move(playout_event)); |
| 325 | 326 |
| 326 rtp_timestamp += RtpTimeDelta::FromTicks(90); | 327 rtp_timestamp += RtpTimeDelta::FromTicks(90); |
| 327 frame_id++; | 328 frame_id++; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 350 base::TimeDelta total_network_latency; | 351 base::TimeDelta total_network_latency; |
| 351 base::TimeDelta total_queueing_latency; | 352 base::TimeDelta total_queueing_latency; |
| 352 base::TimeDelta total_packet_latency; | 353 base::TimeDelta total_packet_latency; |
| 353 int num_packets_transmitted = 0; | 354 int num_packets_transmitted = 0; |
| 354 int num_packets_received = 0; | 355 int num_packets_received = 0; |
| 355 int num_packets_retransmitted = 0; | 356 int num_packets_retransmitted = 0; |
| 356 int num_packets_rtx_rejected = 0; | 357 int num_packets_rtx_rejected = 0; |
| 357 | 358 |
| 358 base::TimeTicks sender_encoded_time = sender_clock_->NowTicks(); | 359 base::TimeTicks sender_encoded_time = sender_clock_->NowTicks(); |
| 359 base::TimeTicks receiver_encoded_time = receiver_clock_.NowTicks(); | 360 base::TimeTicks receiver_encoded_time = receiver_clock_.NowTicks(); |
| 360 scoped_ptr<FrameEvent> encode_event(new FrameEvent()); | 361 std::unique_ptr<FrameEvent> encode_event(new FrameEvent()); |
| 361 encode_event->timestamp = sender_encoded_time; | 362 encode_event->timestamp = sender_encoded_time; |
| 362 encode_event->type = FRAME_ENCODED; | 363 encode_event->type = FRAME_ENCODED; |
| 363 encode_event->media_type = VIDEO_EVENT; | 364 encode_event->media_type = VIDEO_EVENT; |
| 364 encode_event->rtp_timestamp = rtp_timestamp; | 365 encode_event->rtp_timestamp = rtp_timestamp; |
| 365 encode_event->frame_id = 0; | 366 encode_event->frame_id = 0; |
| 366 cast_environment_->logger()->DispatchFrameEvent(std::move(encode_event)); | 367 cast_environment_->logger()->DispatchFrameEvent(std::move(encode_event)); |
| 367 | 368 |
| 368 // Every 2nd packet will be retransmitted once. | 369 // Every 2nd packet will be retransmitted once. |
| 369 // Every 4th packet will be retransmitted twice. | 370 // Every 4th packet will be retransmitted twice. |
| 370 // Every 8th packet will be retransmitted 3 times + 1 rejected retransmission. | 371 // Every 8th packet will be retransmitted 3 times + 1 rejected retransmission. |
| 371 for (int i = 0; i < num_packets; i++) { | 372 for (int i = 0; i < num_packets; i++) { |
| 372 int size = 1000 + base::RandInt(-100, 100); | 373 int size = 1000 + base::RandInt(-100, 100); |
| 373 total_size += size; | 374 total_size += size; |
| 374 | 375 |
| 375 scoped_ptr<PacketEvent> send_event(new PacketEvent()); | 376 std::unique_ptr<PacketEvent> send_event(new PacketEvent()); |
| 376 send_event->timestamp = sender_clock_->NowTicks(); | 377 send_event->timestamp = sender_clock_->NowTicks(); |
| 377 send_event->type = PACKET_SENT_TO_NETWORK; | 378 send_event->type = PACKET_SENT_TO_NETWORK; |
| 378 send_event->media_type = VIDEO_EVENT; | 379 send_event->media_type = VIDEO_EVENT; |
| 379 send_event->rtp_timestamp = rtp_timestamp; | 380 send_event->rtp_timestamp = rtp_timestamp; |
| 380 send_event->frame_id = 0; | 381 send_event->frame_id = 0; |
| 381 send_event->packet_id = i; | 382 send_event->packet_id = i; |
| 382 send_event->max_packet_id = num_packets - 1; | 383 send_event->max_packet_id = num_packets - 1; |
| 383 send_event->size = size; | 384 send_event->size = size; |
| 384 cast_environment_->logger()->DispatchPacketEvent(std::move(send_event)); | 385 cast_environment_->logger()->DispatchPacketEvent(std::move(send_event)); |
| 385 | 386 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 396 num_latency_recorded_packets++; | 397 num_latency_recorded_packets++; |
| 397 } | 398 } |
| 398 | 399 |
| 399 AdvanceClocks(latency); | 400 AdvanceClocks(latency); |
| 400 | 401 |
| 401 base::TimeTicks received_time = receiver_clock_.NowTicks(); | 402 base::TimeTicks received_time = receiver_clock_.NowTicks(); |
| 402 | 403 |
| 403 // Retransmission 1. | 404 // Retransmission 1. |
| 404 AdvanceClocks(base::TimeDelta::FromMicroseconds(12345)); | 405 AdvanceClocks(base::TimeDelta::FromMicroseconds(12345)); |
| 405 if (i % 2 == 0) { | 406 if (i % 2 == 0) { |
| 406 scoped_ptr<PacketEvent> retransmit_event(new PacketEvent()); | 407 std::unique_ptr<PacketEvent> retransmit_event(new PacketEvent()); |
| 407 retransmit_event->timestamp = receiver_clock_.NowTicks(); | 408 retransmit_event->timestamp = receiver_clock_.NowTicks(); |
| 408 retransmit_event->type = PACKET_RETRANSMITTED; | 409 retransmit_event->type = PACKET_RETRANSMITTED; |
| 409 retransmit_event->media_type = VIDEO_EVENT; | 410 retransmit_event->media_type = VIDEO_EVENT; |
| 410 retransmit_event->rtp_timestamp = rtp_timestamp; | 411 retransmit_event->rtp_timestamp = rtp_timestamp; |
| 411 retransmit_event->frame_id = 0; | 412 retransmit_event->frame_id = 0; |
| 412 retransmit_event->packet_id = i; | 413 retransmit_event->packet_id = i; |
| 413 retransmit_event->max_packet_id = num_packets - 1; | 414 retransmit_event->max_packet_id = num_packets - 1; |
| 414 retransmit_event->size = size; | 415 retransmit_event->size = size; |
| 415 cast_environment_->logger()->DispatchPacketEvent( | 416 cast_environment_->logger()->DispatchPacketEvent( |
| 416 std::move(retransmit_event)); | 417 std::move(retransmit_event)); |
| 417 | 418 |
| 418 retransmit_total_size += size; | 419 retransmit_total_size += size; |
| 419 num_packets_transmitted++; | 420 num_packets_transmitted++; |
| 420 num_packets_retransmitted++; | 421 num_packets_retransmitted++; |
| 421 } | 422 } |
| 422 | 423 |
| 423 // Retransmission 2. | 424 // Retransmission 2. |
| 424 AdvanceClocks(base::TimeDelta::FromMicroseconds(13456)); | 425 AdvanceClocks(base::TimeDelta::FromMicroseconds(13456)); |
| 425 if (i % 4 == 0) { | 426 if (i % 4 == 0) { |
| 426 scoped_ptr<PacketEvent> retransmit_event(new PacketEvent()); | 427 std::unique_ptr<PacketEvent> retransmit_event(new PacketEvent()); |
| 427 retransmit_event->timestamp = receiver_clock_.NowTicks(); | 428 retransmit_event->timestamp = receiver_clock_.NowTicks(); |
| 428 retransmit_event->type = PACKET_RETRANSMITTED; | 429 retransmit_event->type = PACKET_RETRANSMITTED; |
| 429 retransmit_event->media_type = VIDEO_EVENT; | 430 retransmit_event->media_type = VIDEO_EVENT; |
| 430 retransmit_event->rtp_timestamp = rtp_timestamp; | 431 retransmit_event->rtp_timestamp = rtp_timestamp; |
| 431 retransmit_event->frame_id = 0; | 432 retransmit_event->frame_id = 0; |
| 432 retransmit_event->packet_id = i; | 433 retransmit_event->packet_id = i; |
| 433 retransmit_event->max_packet_id = num_packets - 1; | 434 retransmit_event->max_packet_id = num_packets - 1; |
| 434 retransmit_event->size = size; | 435 retransmit_event->size = size; |
| 435 cast_environment_->logger()->DispatchPacketEvent( | 436 cast_environment_->logger()->DispatchPacketEvent( |
| 436 std::move(retransmit_event)); | 437 std::move(retransmit_event)); |
| 437 | 438 |
| 438 retransmit_total_size += size; | 439 retransmit_total_size += size; |
| 439 num_packets_transmitted++; | 440 num_packets_transmitted++; |
| 440 num_packets_retransmitted++; | 441 num_packets_retransmitted++; |
| 441 } | 442 } |
| 442 | 443 |
| 443 // Retransmission 3. | 444 // Retransmission 3. |
| 444 AdvanceClocks(base::TimeDelta::FromMicroseconds(14567)); | 445 AdvanceClocks(base::TimeDelta::FromMicroseconds(14567)); |
| 445 if (i % 8 == 0) { | 446 if (i % 8 == 0) { |
| 446 scoped_ptr<PacketEvent> retransmit_event(new PacketEvent()); | 447 std::unique_ptr<PacketEvent> retransmit_event(new PacketEvent()); |
| 447 retransmit_event->timestamp = receiver_clock_.NowTicks(); | 448 retransmit_event->timestamp = receiver_clock_.NowTicks(); |
| 448 retransmit_event->type = PACKET_RETRANSMITTED; | 449 retransmit_event->type = PACKET_RETRANSMITTED; |
| 449 retransmit_event->media_type = VIDEO_EVENT; | 450 retransmit_event->media_type = VIDEO_EVENT; |
| 450 retransmit_event->rtp_timestamp = rtp_timestamp; | 451 retransmit_event->rtp_timestamp = rtp_timestamp; |
| 451 retransmit_event->frame_id = 0; | 452 retransmit_event->frame_id = 0; |
| 452 retransmit_event->packet_id = i; | 453 retransmit_event->packet_id = i; |
| 453 retransmit_event->max_packet_id = num_packets - 1; | 454 retransmit_event->max_packet_id = num_packets - 1; |
| 454 retransmit_event->size = size; | 455 retransmit_event->size = size; |
| 455 cast_environment_->logger()->DispatchPacketEvent( | 456 cast_environment_->logger()->DispatchPacketEvent( |
| 456 std::move(retransmit_event)); | 457 std::move(retransmit_event)); |
| 457 | 458 |
| 458 scoped_ptr<PacketEvent> reject_event(new PacketEvent()); | 459 std::unique_ptr<PacketEvent> reject_event(new PacketEvent()); |
| 459 reject_event->timestamp = receiver_clock_.NowTicks(); | 460 reject_event->timestamp = receiver_clock_.NowTicks(); |
| 460 reject_event->type = PACKET_RTX_REJECTED; | 461 reject_event->type = PACKET_RTX_REJECTED; |
| 461 reject_event->media_type = VIDEO_EVENT; | 462 reject_event->media_type = VIDEO_EVENT; |
| 462 reject_event->rtp_timestamp = rtp_timestamp; | 463 reject_event->rtp_timestamp = rtp_timestamp; |
| 463 reject_event->frame_id = 0; | 464 reject_event->frame_id = 0; |
| 464 reject_event->packet_id = i; | 465 reject_event->packet_id = i; |
| 465 reject_event->max_packet_id = num_packets - 1; | 466 reject_event->max_packet_id = num_packets - 1; |
| 466 reject_event->size = size; | 467 reject_event->size = size; |
| 467 cast_environment_->logger()->DispatchPacketEvent(std::move(reject_event)); | 468 cast_environment_->logger()->DispatchPacketEvent(std::move(reject_event)); |
| 468 | 469 |
| 469 retransmit_total_size += size; | 470 retransmit_total_size += size; |
| 470 num_packets_transmitted++; | 471 num_packets_transmitted++; |
| 471 num_packets_retransmitted++; | 472 num_packets_retransmitted++; |
| 472 num_packets_rtx_rejected++; | 473 num_packets_rtx_rejected++; |
| 473 } | 474 } |
| 474 | 475 |
| 475 scoped_ptr<PacketEvent> receive_event(new PacketEvent()); | 476 std::unique_ptr<PacketEvent> receive_event(new PacketEvent()); |
| 476 receive_event->timestamp = received_time; | 477 receive_event->timestamp = received_time; |
| 477 receive_event->type = PACKET_RECEIVED; | 478 receive_event->type = PACKET_RECEIVED; |
| 478 receive_event->media_type = VIDEO_EVENT; | 479 receive_event->media_type = VIDEO_EVENT; |
| 479 receive_event->rtp_timestamp = rtp_timestamp; | 480 receive_event->rtp_timestamp = rtp_timestamp; |
| 480 receive_event->frame_id = 0; | 481 receive_event->frame_id = 0; |
| 481 receive_event->packet_id = i; | 482 receive_event->packet_id = i; |
| 482 receive_event->max_packet_id = num_packets - 1; | 483 receive_event->max_packet_id = num_packets - 1; |
| 483 receive_event->size = size; | 484 receive_event->size = size; |
| 484 cast_environment_->logger()->DispatchPacketEvent(std::move(receive_event)); | 485 cast_environment_->logger()->DispatchPacketEvent(std::move(receive_event)); |
| 485 | 486 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 | 571 |
| 571 RtpTimeTicks rtp_timestamp = RtpTimeTicks().Expand(UINT32_C(123)); | 572 RtpTimeTicks rtp_timestamp = RtpTimeTicks().Expand(UINT32_C(123)); |
| 572 uint32_t frame_id = 0; | 573 uint32_t frame_id = 0; |
| 573 | 574 |
| 574 // 10 Frames with capture latency in the bucket of "10-14"ms. | 575 // 10 Frames with capture latency in the bucket of "10-14"ms. |
| 575 // 10 Frames with encode time in the bucket of "15-19"ms. | 576 // 10 Frames with encode time in the bucket of "15-19"ms. |
| 576 for (int i = 0; i < 10; ++i) { | 577 for (int i = 0; i < 10; ++i) { |
| 577 ++frame_id; | 578 ++frame_id; |
| 578 rtp_timestamp += RtpTimeDelta::FromTicks(1); | 579 rtp_timestamp += RtpTimeDelta::FromTicks(1); |
| 579 | 580 |
| 580 scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); | 581 std::unique_ptr<FrameEvent> capture_begin_event(new FrameEvent()); |
| 581 capture_begin_event->timestamp = sender_clock_->NowTicks(); | 582 capture_begin_event->timestamp = sender_clock_->NowTicks(); |
| 582 capture_begin_event->type = FRAME_CAPTURE_BEGIN; | 583 capture_begin_event->type = FRAME_CAPTURE_BEGIN; |
| 583 capture_begin_event->media_type = VIDEO_EVENT; | 584 capture_begin_event->media_type = VIDEO_EVENT; |
| 584 capture_begin_event->rtp_timestamp = rtp_timestamp; | 585 capture_begin_event->rtp_timestamp = rtp_timestamp; |
| 585 cast_environment_->logger()->DispatchFrameEvent( | 586 cast_environment_->logger()->DispatchFrameEvent( |
| 586 std::move(capture_begin_event)); | 587 std::move(capture_begin_event)); |
| 587 | 588 |
| 588 AdvanceClocks(base::TimeDelta::FromMilliseconds(10)); | 589 AdvanceClocks(base::TimeDelta::FromMilliseconds(10)); |
| 589 scoped_ptr<FrameEvent> capture_end_event(new FrameEvent()); | 590 std::unique_ptr<FrameEvent> capture_end_event(new FrameEvent()); |
| 590 capture_end_event->timestamp = sender_clock_->NowTicks(); | 591 capture_end_event->timestamp = sender_clock_->NowTicks(); |
| 591 capture_end_event->type = FRAME_CAPTURE_END; | 592 capture_end_event->type = FRAME_CAPTURE_END; |
| 592 capture_end_event->media_type = VIDEO_EVENT; | 593 capture_end_event->media_type = VIDEO_EVENT; |
| 593 capture_end_event->rtp_timestamp = rtp_timestamp; | 594 capture_end_event->rtp_timestamp = rtp_timestamp; |
| 594 cast_environment_->logger()->DispatchFrameEvent( | 595 cast_environment_->logger()->DispatchFrameEvent( |
| 595 std::move(capture_end_event)); | 596 std::move(capture_end_event)); |
| 596 | 597 |
| 597 AdvanceClocks(base::TimeDelta::FromMilliseconds(15)); | 598 AdvanceClocks(base::TimeDelta::FromMilliseconds(15)); |
| 598 scoped_ptr<FrameEvent> encode_event(new FrameEvent()); | 599 std::unique_ptr<FrameEvent> encode_event(new FrameEvent()); |
| 599 encode_event->timestamp = sender_clock_->NowTicks(); | 600 encode_event->timestamp = sender_clock_->NowTicks(); |
| 600 encode_event->type = FRAME_ENCODED; | 601 encode_event->type = FRAME_ENCODED; |
| 601 encode_event->media_type = VIDEO_EVENT; | 602 encode_event->media_type = VIDEO_EVENT; |
| 602 encode_event->rtp_timestamp = rtp_timestamp; | 603 encode_event->rtp_timestamp = rtp_timestamp; |
| 603 encode_event->frame_id = frame_id; | 604 encode_event->frame_id = frame_id; |
| 604 encode_event->size = 1024; | 605 encode_event->size = 1024; |
| 605 encode_event->key_frame = true; | 606 encode_event->key_frame = true; |
| 606 encode_event->target_bitrate = 5678; | 607 encode_event->target_bitrate = 5678; |
| 607 encode_event->encoder_cpu_utilization = 9.10; | 608 encode_event->encoder_cpu_utilization = 9.10; |
| 608 encode_event->idealized_bitrate_utilization = 11.12; | 609 encode_event->idealized_bitrate_utilization = 11.12; |
| 609 cast_environment_->logger()->DispatchFrameEvent(std::move(encode_event)); | 610 cast_environment_->logger()->DispatchFrameEvent(std::move(encode_event)); |
| 610 } | 611 } |
| 611 | 612 |
| 612 // Send 3 packets for the last frame. | 613 // Send 3 packets for the last frame. |
| 613 // Queueing latencies are 100ms, 200ms and 300ms. | 614 // Queueing latencies are 100ms, 200ms and 300ms. |
| 614 for (int i = 0; i < 3; ++i) { | 615 for (int i = 0; i < 3; ++i) { |
| 615 AdvanceClocks(base::TimeDelta::FromMilliseconds(100)); | 616 AdvanceClocks(base::TimeDelta::FromMilliseconds(100)); |
| 616 scoped_ptr<PacketEvent> send_event(new PacketEvent()); | 617 std::unique_ptr<PacketEvent> send_event(new PacketEvent()); |
| 617 send_event->timestamp = sender_clock_->NowTicks(); | 618 send_event->timestamp = sender_clock_->NowTicks(); |
| 618 send_event->type = PACKET_SENT_TO_NETWORK; | 619 send_event->type = PACKET_SENT_TO_NETWORK; |
| 619 send_event->media_type = VIDEO_EVENT; | 620 send_event->media_type = VIDEO_EVENT; |
| 620 send_event->rtp_timestamp = rtp_timestamp; | 621 send_event->rtp_timestamp = rtp_timestamp; |
| 621 send_event->frame_id = 0; | 622 send_event->frame_id = 0; |
| 622 send_event->packet_id = i; | 623 send_event->packet_id = i; |
| 623 send_event->max_packet_id = 2; | 624 send_event->max_packet_id = 2; |
| 624 send_event->size = 123; | 625 send_event->size = 123; |
| 625 cast_environment_->logger()->DispatchPacketEvent(std::move(send_event)); | 626 cast_environment_->logger()->DispatchPacketEvent(std::move(send_event)); |
| 626 } | 627 } |
| 627 | 628 |
| 628 // Receive 3 packets for the last frame. | 629 // Receive 3 packets for the last frame. |
| 629 // Network latencies are 100ms, 200ms and 300ms. | 630 // Network latencies are 100ms, 200ms and 300ms. |
| 630 // Packet latencies are 400ms. | 631 // Packet latencies are 400ms. |
| 631 AdvanceClocks(base::TimeDelta::FromMilliseconds(100)); | 632 AdvanceClocks(base::TimeDelta::FromMilliseconds(100)); |
| 632 for (int i = 0; i < 3; ++i) { | 633 for (int i = 0; i < 3; ++i) { |
| 633 scoped_ptr<PacketEvent> receive_event(new PacketEvent()); | 634 std::unique_ptr<PacketEvent> receive_event(new PacketEvent()); |
| 634 receive_event->timestamp = receiver_clock_.NowTicks(); | 635 receive_event->timestamp = receiver_clock_.NowTicks(); |
| 635 receive_event->type = PACKET_RECEIVED; | 636 receive_event->type = PACKET_RECEIVED; |
| 636 receive_event->media_type = VIDEO_EVENT; | 637 receive_event->media_type = VIDEO_EVENT; |
| 637 receive_event->rtp_timestamp = rtp_timestamp; | 638 receive_event->rtp_timestamp = rtp_timestamp; |
| 638 receive_event->frame_id = 0; | 639 receive_event->frame_id = 0; |
| 639 receive_event->packet_id = i; | 640 receive_event->packet_id = i; |
| 640 receive_event->max_packet_id = 2; | 641 receive_event->max_packet_id = 2; |
| 641 receive_event->size = 123; | 642 receive_event->size = 123; |
| 642 cast_environment_->logger()->DispatchPacketEvent(std::move(receive_event)); | 643 cast_environment_->logger()->DispatchPacketEvent(std::move(receive_event)); |
| 643 } | 644 } |
| 644 | 645 |
| 645 scoped_ptr<FrameEvent> playout_event(new FrameEvent()); | 646 std::unique_ptr<FrameEvent> playout_event(new FrameEvent()); |
| 646 playout_event->timestamp = receiver_clock_.NowTicks(); | 647 playout_event->timestamp = receiver_clock_.NowTicks(); |
| 647 playout_event->type = FRAME_PLAYOUT; | 648 playout_event->type = FRAME_PLAYOUT; |
| 648 playout_event->media_type = VIDEO_EVENT; | 649 playout_event->media_type = VIDEO_EVENT; |
| 649 playout_event->rtp_timestamp = rtp_timestamp; | 650 playout_event->rtp_timestamp = rtp_timestamp; |
| 650 playout_event->frame_id = frame_id; | 651 playout_event->frame_id = frame_id; |
| 651 playout_event->delay_delta = base::TimeDelta::FromMilliseconds(100); | 652 playout_event->delay_delta = base::TimeDelta::FromMilliseconds(100); |
| 652 cast_environment_->logger()->DispatchFrameEvent(std::move(playout_event)); | 653 cast_environment_->logger()->DispatchFrameEvent(std::move(playout_event)); |
| 653 | 654 |
| 654 StatsEventSubscriber::SimpleHistogram* histogram; | 655 StatsEventSubscriber::SimpleHistogram* histogram; |
| 655 scoped_ptr<base::ListValue> values; | 656 std::unique_ptr<base::ListValue> values; |
| 656 | 657 |
| 657 histogram = subscriber_->GetHistogramForTesting( | 658 histogram = subscriber_->GetHistogramForTesting( |
| 658 StatsEventSubscriber::CAPTURE_LATENCY_MS_HISTO); | 659 StatsEventSubscriber::CAPTURE_LATENCY_MS_HISTO); |
| 659 ASSERT_TRUE(histogram); | 660 ASSERT_TRUE(histogram); |
| 660 values = histogram->GetHistogram(); | 661 values = histogram->GetHistogram(); |
| 661 EXPECT_TRUE(CheckHistogramHasValue(values.get(), "10-14", 10)); | 662 EXPECT_TRUE(CheckHistogramHasValue(values.get(), "10-14", 10)); |
| 662 | 663 |
| 663 histogram = subscriber_->GetHistogramForTesting( | 664 histogram = subscriber_->GetHistogramForTesting( |
| 664 StatsEventSubscriber::ENCODE_TIME_MS_HISTO); | 665 StatsEventSubscriber::ENCODE_TIME_MS_HISTO); |
| 665 ASSERT_TRUE(histogram); | 666 ASSERT_TRUE(histogram); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 690 | 691 |
| 691 histogram = subscriber_->GetHistogramForTesting( | 692 histogram = subscriber_->GetHistogramForTesting( |
| 692 StatsEventSubscriber::LATE_FRAME_MS_HISTO); | 693 StatsEventSubscriber::LATE_FRAME_MS_HISTO); |
| 693 ASSERT_TRUE(histogram); | 694 ASSERT_TRUE(histogram); |
| 694 values = histogram->GetHistogram(); | 695 values = histogram->GetHistogram(); |
| 695 EXPECT_TRUE(CheckHistogramHasValue(values.get(), "100-119", 1)); | 696 EXPECT_TRUE(CheckHistogramHasValue(values.get(), "100-119", 1)); |
| 696 } | 697 } |
| 697 | 698 |
| 698 } // namespace cast | 699 } // namespace cast |
| 699 } // namespace media | 700 } // namespace media |
| OLD | NEW |