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/net/cast_transport_impl.h" | 5 #include "media/cast/net/cast_transport_impl.h" |
6 | 6 |
7 #include <gtest/gtest.h> | 7 #include <gtest/gtest.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 12 matching lines...) Expand all Loading... |
23 | 23 |
24 namespace media { | 24 namespace media { |
25 namespace cast { | 25 namespace cast { |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 const int64_t kStartMillisecond = INT64_C(12345678900000); | 29 const int64_t kStartMillisecond = INT64_C(12345678900000); |
30 const uint32_t kVideoSsrc = 1; | 30 const uint32_t kVideoSsrc = 1; |
31 const uint32_t kAudioSsrc = 2; | 31 const uint32_t kAudioSsrc = 2; |
32 | 32 |
| 33 class StubRtcpObserver : public RtcpObserver { |
| 34 public: |
| 35 StubRtcpObserver() {} |
| 36 |
| 37 void OnReceivedCastMessage(const RtcpCastMessage& cast_message) final {} |
| 38 void OnReceivedRtt(base::TimeDelta round_trip_time) final {} |
| 39 void OnReceivedPli() final {} |
| 40 |
| 41 DISALLOW_COPY_AND_ASSIGN(StubRtcpObserver); |
| 42 }; |
| 43 |
33 } // namespace | 44 } // namespace |
34 | 45 |
35 class FakePacketSender : public PacketTransport { | 46 class FakePacketSender : public PacketTransport { |
36 public: | 47 public: |
37 FakePacketSender() : paused_(false), packets_sent_(0), bytes_sent_(0) {} | 48 FakePacketSender() : paused_(false), packets_sent_(0), bytes_sent_(0) {} |
38 | 49 |
39 bool SendPacket(PacketRef packet, const base::Closure& cb) final { | 50 bool SendPacket(PacketRef packet, const base::Closure& cb) final { |
40 if (paused_) { | 51 if (paused_) { |
41 stored_packet_ = packet; | 52 stored_packet_ = packet; |
42 callback_ = cb; | 53 callback_ = cb; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 100 |
90 void InitWithoutLogging(); | 101 void InitWithoutLogging(); |
91 void InitWithOptions(); | 102 void InitWithOptions(); |
92 void InitWithLogging(); | 103 void InitWithLogging(); |
93 | 104 |
94 void InitializeVideo() { | 105 void InitializeVideo() { |
95 CastTransportRtpConfig rtp_config; | 106 CastTransportRtpConfig rtp_config; |
96 rtp_config.ssrc = kVideoSsrc; | 107 rtp_config.ssrc = kVideoSsrc; |
97 rtp_config.feedback_ssrc = 2; | 108 rtp_config.feedback_ssrc = 2; |
98 rtp_config.rtp_payload_type = 3; | 109 rtp_config.rtp_payload_type = 3; |
99 transport_sender_->InitializeVideo(rtp_config, RtcpCastMessageCallback(), | 110 transport_sender_->InitializeVideo( |
100 RtcpRttCallback(), RtcpPliCallback()); | 111 rtp_config, base::WrapUnique(new StubRtcpObserver())); |
101 } | 112 } |
102 | 113 |
103 void InitializeAudio() { | 114 void InitializeAudio() { |
104 CastTransportRtpConfig rtp_config; | 115 CastTransportRtpConfig rtp_config; |
105 rtp_config.ssrc = kAudioSsrc; | 116 rtp_config.ssrc = kAudioSsrc; |
106 rtp_config.feedback_ssrc = 3; | 117 rtp_config.feedback_ssrc = 3; |
107 rtp_config.rtp_payload_type = 4; | 118 rtp_config.rtp_payload_type = 4; |
108 transport_sender_->InitializeAudio(rtp_config, RtcpCastMessageCallback(), | 119 transport_sender_->InitializeAudio( |
109 RtcpRttCallback(), RtcpPliCallback()); | 120 rtp_config, base::WrapUnique(new StubRtcpObserver())); |
110 } | 121 } |
111 | 122 |
112 base::SimpleTestTickClock testing_clock_; | 123 base::SimpleTestTickClock testing_clock_; |
113 scoped_refptr<FakeSingleThreadTaskRunner> task_runner_; | 124 scoped_refptr<FakeSingleThreadTaskRunner> task_runner_; |
114 std::unique_ptr<CastTransportImpl> transport_sender_; | 125 std::unique_ptr<CastTransportImpl> transport_sender_; |
115 FakePacketSender* transport_; // Owned by CastTransport. | 126 FakePacketSender* transport_; // Owned by CastTransport. |
116 int num_times_logging_callback_called_; | 127 int num_times_logging_callback_called_; |
117 }; | 128 }; |
118 | 129 |
119 namespace { | 130 namespace { |
120 | 131 |
121 class TransportClient : public CastTransport::Client { | 132 class TransportClient : public CastTransport::Client { |
122 public: | 133 public: |
123 explicit TransportClient( | 134 explicit TransportClient( |
124 CastTransportImplTest* cast_transport_sender_impl_test) | 135 CastTransportImplTest* cast_transport_sender_impl_test) |
125 : cast_transport_sender_impl_test_(cast_transport_sender_impl_test) {} | 136 : cast_transport_sender_impl_test_(cast_transport_sender_impl_test) {} |
126 | 137 |
127 void OnStatusChanged(CastTransportStatus status) final{}; | 138 void OnStatusChanged(CastTransportStatus status) final{}; |
128 void OnLoggingEventsReceived( | 139 void OnLoggingEventsReceived( |
129 std::unique_ptr<std::vector<FrameEvent>> frame_events, | 140 std::unique_ptr<std::vector<FrameEvent>> frame_events, |
130 std::unique_ptr<std::vector<PacketEvent>> packet_events) final { | 141 std::unique_ptr<std::vector<PacketEvent>> packet_events) final { |
131 CHECK(cast_transport_sender_impl_test_); | 142 CHECK(cast_transport_sender_impl_test_); |
132 cast_transport_sender_impl_test_->ReceivedLoggingEvents(); | 143 cast_transport_sender_impl_test_->ReceivedLoggingEvents(); |
133 }; | 144 }; |
134 void ProcessRtpPacket(std::unique_ptr<Packet> packet) final{}; | 145 void ProcessRtpPacket(std::unique_ptr<Packet> packet) final {} |
135 | 146 |
136 private: | 147 private: |
137 CastTransportImplTest* const cast_transport_sender_impl_test_; | 148 CastTransportImplTest* const cast_transport_sender_impl_test_; |
138 | 149 |
139 DISALLOW_COPY_AND_ASSIGN(TransportClient); | 150 DISALLOW_COPY_AND_ASSIGN(TransportClient); |
140 }; | 151 }; |
141 | 152 |
142 } // namespace | 153 } // namespace |
143 | 154 |
144 void CastTransportImplTest::InitWithoutLogging() { | 155 void CastTransportImplTest::InitWithoutLogging() { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 transport_sender_->ResendPackets(kVideoSsrc, missing_packets, true, | 228 transport_sender_->ResendPackets(kVideoSsrc, missing_packets, true, |
218 dedup_info); | 229 dedup_info); |
219 | 230 |
220 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); | 231 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); |
221 EXPECT_EQ(2, num_times_logging_callback_called_); | 232 EXPECT_EQ(2, num_times_logging_callback_called_); |
222 | 233 |
223 RtcpCastMessage cast_message; | 234 RtcpCastMessage cast_message; |
224 cast_message.remote_ssrc = kVideoSsrc; | 235 cast_message.remote_ssrc = kVideoSsrc; |
225 cast_message.ack_frame_id = FrameId::first() + 1; | 236 cast_message.ack_frame_id = FrameId::first() + 1; |
226 cast_message.missing_frames_and_packets[fake_frame.frame_id].insert(3); | 237 cast_message.missing_frames_and_packets[fake_frame.frame_id].insert(3); |
227 transport_sender_->OnReceivedCastMessage( | 238 transport_sender_->OnReceivedCastMessage(kVideoSsrc, cast_message); |
228 kVideoSsrc, RtcpCastMessageCallback(), cast_message); | |
229 transport_->SetPaused(false); | 239 transport_->SetPaused(false); |
230 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); | 240 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); |
231 EXPECT_EQ(3, num_times_logging_callback_called_); | 241 EXPECT_EQ(3, num_times_logging_callback_called_); |
232 | 242 |
233 // Resend one packet in the socket when unpaused. | 243 // Resend one packet in the socket when unpaused. |
234 // Resend one more packet from NACK. | 244 // Resend one more packet from NACK. |
235 EXPECT_EQ(6, transport_->packets_sent()); | 245 EXPECT_EQ(6, transport_->packets_sent()); |
236 } | 246 } |
237 | 247 |
238 TEST_F(CastTransportImplTest, CancelRetransmits) { | 248 TEST_F(CastTransportImplTest, CancelRetransmits) { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 fake_audio.frame_id = FrameId::first() + 2; | 349 fake_audio.frame_id = FrameId::first() + 2; |
340 fake_audio.reference_time = testing_clock_.NowTicks(); | 350 fake_audio.reference_time = testing_clock_.NowTicks(); |
341 transport_sender_->InsertFrame(kAudioSsrc, fake_audio); | 351 transport_sender_->InsertFrame(kAudioSsrc, fake_audio); |
342 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 352 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
343 EXPECT_EQ(2, transport_->packets_sent()); | 353 EXPECT_EQ(2, transport_->packets_sent()); |
344 | 354 |
345 // Ack the first audio frame. | 355 // Ack the first audio frame. |
346 RtcpCastMessage cast_message; | 356 RtcpCastMessage cast_message; |
347 cast_message.remote_ssrc = kAudioSsrc; | 357 cast_message.remote_ssrc = kAudioSsrc; |
348 cast_message.ack_frame_id = FrameId::first() + 1; | 358 cast_message.ack_frame_id = FrameId::first() + 1; |
349 transport_sender_->OnReceivedCastMessage( | 359 transport_sender_->OnReceivedCastMessage(kAudioSsrc, cast_message); |
350 kAudioSsrc, RtcpCastMessageCallback(), cast_message); | |
351 task_runner_->RunTasks(); | 360 task_runner_->RunTasks(); |
352 EXPECT_EQ(2, transport_->packets_sent()); | 361 EXPECT_EQ(2, transport_->packets_sent()); |
353 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. | 362 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. |
354 | 363 |
355 // Send a fake video frame that will be decomposed into 4 packets. | 364 // Send a fake video frame that will be decomposed into 4 packets. |
356 EncodedFrame fake_video; | 365 EncodedFrame fake_video; |
357 fake_video.frame_id = FrameId::first() + 1; | 366 fake_video.frame_id = FrameId::first() + 1; |
358 fake_video.referenced_frame_id = FrameId::first() + 1; | 367 fake_video.referenced_frame_id = FrameId::first() + 1; |
359 fake_video.dependency = EncodedFrame::KEY; | 368 fake_video.dependency = EncodedFrame::KEY; |
360 fake_video.data.resize(5000, ' '); | 369 fake_video.data.resize(5000, ' '); |
361 transport_sender_->InsertFrame(kVideoSsrc, fake_video); | 370 transport_sender_->InsertFrame(kVideoSsrc, fake_video); |
362 task_runner_->RunTasks(); | 371 task_runner_->RunTasks(); |
363 EXPECT_EQ(6, transport_->packets_sent()); | 372 EXPECT_EQ(6, transport_->packets_sent()); |
364 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. | 373 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. |
365 | 374 |
366 // Retransmission is reject because audio is not acked yet. | 375 // Retransmission is reject because audio is not acked yet. |
367 cast_message.remote_ssrc = kVideoSsrc; | 376 cast_message.remote_ssrc = kVideoSsrc; |
368 cast_message.ack_frame_id = FrameId::first(); | 377 cast_message.ack_frame_id = FrameId::first(); |
369 cast_message.missing_frames_and_packets[fake_video.frame_id].insert(3); | 378 cast_message.missing_frames_and_packets[fake_video.frame_id].insert(3); |
370 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); | 379 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); |
371 transport_sender_->OnReceivedCastMessage( | 380 transport_sender_->OnReceivedCastMessage(kVideoSsrc, cast_message); |
372 kVideoSsrc, RtcpCastMessageCallback(), cast_message); | |
373 task_runner_->RunTasks(); | 381 task_runner_->RunTasks(); |
374 EXPECT_EQ(6, transport_->packets_sent()); | 382 EXPECT_EQ(6, transport_->packets_sent()); |
375 EXPECT_EQ(1, num_times_logging_callback_called_); | 383 EXPECT_EQ(1, num_times_logging_callback_called_); |
376 | 384 |
377 // Ack the second audio frame. | 385 // Ack the second audio frame. |
378 cast_message.remote_ssrc = kAudioSsrc; | 386 cast_message.remote_ssrc = kAudioSsrc; |
379 cast_message.ack_frame_id = FrameId::first() + 2; | 387 cast_message.ack_frame_id = FrameId::first() + 2; |
380 cast_message.missing_frames_and_packets.clear(); | 388 cast_message.missing_frames_and_packets.clear(); |
381 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 389 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
382 transport_sender_->OnReceivedCastMessage( | 390 transport_sender_->OnReceivedCastMessage(kAudioSsrc, cast_message); |
383 kAudioSsrc, RtcpCastMessageCallback(), cast_message); | |
384 task_runner_->RunTasks(); | 391 task_runner_->RunTasks(); |
385 EXPECT_EQ(6, transport_->packets_sent()); | 392 EXPECT_EQ(6, transport_->packets_sent()); |
386 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 6 ms since last. | 393 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 6 ms since last. |
387 | 394 |
388 // Retransmission of video packet now accepted. | 395 // Retransmission of video packet now accepted. |
389 cast_message.remote_ssrc = kVideoSsrc; | 396 cast_message.remote_ssrc = kVideoSsrc; |
390 cast_message.ack_frame_id = FrameId::first() + 1; | 397 cast_message.ack_frame_id = FrameId::first() + 1; |
391 cast_message.missing_frames_and_packets[fake_video.frame_id].insert(3); | 398 cast_message.missing_frames_and_packets[fake_video.frame_id].insert(3); |
392 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 399 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
393 transport_sender_->OnReceivedCastMessage( | 400 transport_sender_->OnReceivedCastMessage(kVideoSsrc, cast_message); |
394 kVideoSsrc, RtcpCastMessageCallback(), cast_message); | |
395 task_runner_->RunTasks(); | 401 task_runner_->RunTasks(); |
396 EXPECT_EQ(7, transport_->packets_sent()); | 402 EXPECT_EQ(7, transport_->packets_sent()); |
397 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 8 ms since last. | 403 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 8 ms since last. |
398 | 404 |
399 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 405 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
400 EXPECT_EQ(2, num_times_logging_callback_called_); | 406 EXPECT_EQ(2, num_times_logging_callback_called_); |
401 } | 407 } |
402 | 408 |
403 } // namespace cast | 409 } // namespace cast |
404 } // namespace media | 410 } // namespace media |
OLD | NEW |