| 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 |