| 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_sender_impl.h" | 5 #include "media/cast/net/cast_transport_sender_impl.h" |
| 6 | 6 |
| 7 #include <gtest/gtest.h> | 7 #include <gtest/gtest.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 void InitWithoutLogging(); | 89 void InitWithoutLogging(); |
| 90 void InitWithOptions(); | 90 void InitWithOptions(); |
| 91 void InitWithLogging(); | 91 void InitWithLogging(); |
| 92 | 92 |
| 93 void InitializeVideo() { | 93 void InitializeVideo() { |
| 94 CastTransportRtpConfig rtp_config; | 94 CastTransportRtpConfig rtp_config; |
| 95 rtp_config.ssrc = kVideoSsrc; | 95 rtp_config.ssrc = kVideoSsrc; |
| 96 rtp_config.feedback_ssrc = 2; | 96 rtp_config.feedback_ssrc = 2; |
| 97 rtp_config.rtp_payload_type = 3; | 97 rtp_config.rtp_payload_type = 3; |
| 98 transport_sender_->InitializeVideo(rtp_config, RtcpCastMessageCallback(), | 98 transport_sender_->InitializeVideo(rtp_config, RtcpCastMessageCallback(), |
| 99 RtcpRttCallback()); | 99 RtcpRttCallback(), RtcpPliCallback()); |
| 100 } | 100 } |
| 101 | 101 |
| 102 void InitializeAudio() { | 102 void InitializeAudio() { |
| 103 CastTransportRtpConfig rtp_config; | 103 CastTransportRtpConfig rtp_config; |
| 104 rtp_config.ssrc = kAudioSsrc; | 104 rtp_config.ssrc = kAudioSsrc; |
| 105 rtp_config.feedback_ssrc = 3; | 105 rtp_config.feedback_ssrc = 3; |
| 106 rtp_config.rtp_payload_type = 4; | 106 rtp_config.rtp_payload_type = 4; |
| 107 transport_sender_->InitializeAudio(rtp_config, RtcpCastMessageCallback(), | 107 transport_sender_->InitializeAudio(rtp_config, RtcpCastMessageCallback(), |
| 108 RtcpRttCallback()); | 108 RtcpRttCallback(), RtcpPliCallback()); |
| 109 } | 109 } |
| 110 | 110 |
| 111 base::SimpleTestTickClock testing_clock_; | 111 base::SimpleTestTickClock testing_clock_; |
| 112 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 112 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 113 scoped_ptr<CastTransportSenderImpl> transport_sender_; | 113 scoped_ptr<CastTransportSenderImpl> transport_sender_; |
| 114 FakePacketSender* transport_; // Owned by CastTransportSender. | 114 FakePacketSender* transport_; // Owned by CastTransportSender. |
| 115 int num_times_logging_callback_called_; | 115 int num_times_logging_callback_called_; |
| 116 }; | 116 }; |
| 117 | 117 |
| 118 namespace { | 118 namespace { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 transport_->SetPaused(true); | 212 transport_->SetPaused(true); |
| 213 DedupInfo dedup_info; | 213 DedupInfo dedup_info; |
| 214 dedup_info.resend_interval = base::TimeDelta::FromMilliseconds(10); | 214 dedup_info.resend_interval = base::TimeDelta::FromMilliseconds(10); |
| 215 transport_sender_->ResendPackets( | 215 transport_sender_->ResendPackets( |
| 216 kVideoSsrc, missing_packets, true, dedup_info); | 216 kVideoSsrc, missing_packets, true, dedup_info); |
| 217 | 217 |
| 218 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); | 218 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 219 EXPECT_EQ(2, num_times_logging_callback_called_); | 219 EXPECT_EQ(2, num_times_logging_callback_called_); |
| 220 | 220 |
| 221 RtcpCastMessage cast_message; | 221 RtcpCastMessage cast_message; |
| 222 cast_message.media_ssrc = kVideoSsrc; | 222 cast_message.remote_ssrc = kVideoSsrc; |
| 223 cast_message.ack_frame_id = 1; | 223 cast_message.ack_frame_id = 1; |
| 224 cast_message.missing_frames_and_packets[1].insert(3); | 224 cast_message.missing_frames_and_packets[1].insert(3); |
| 225 transport_sender_->OnReceivedCastMessage(kVideoSsrc, | 225 transport_sender_->OnReceivedCastMessage(kVideoSsrc, |
| 226 RtcpCastMessageCallback(), | 226 RtcpCastMessageCallback(), |
| 227 cast_message); | 227 cast_message); |
| 228 transport_->SetPaused(false); | 228 transport_->SetPaused(false); |
| 229 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); | 229 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 230 EXPECT_EQ(3, num_times_logging_callback_called_); | 230 EXPECT_EQ(3, num_times_logging_callback_called_); |
| 231 | 231 |
| 232 // Resend one packet in the socket when unpaused. | 232 // Resend one packet in the socket when unpaused. |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 transport_sender_->InsertFrame(kAudioSsrc, fake_audio); | 334 transport_sender_->InsertFrame(kAudioSsrc, fake_audio); |
| 335 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 335 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
| 336 fake_audio.frame_id = 2; | 336 fake_audio.frame_id = 2; |
| 337 fake_audio.reference_time = testing_clock_.NowTicks(); | 337 fake_audio.reference_time = testing_clock_.NowTicks(); |
| 338 transport_sender_->InsertFrame(kAudioSsrc, fake_audio); | 338 transport_sender_->InsertFrame(kAudioSsrc, fake_audio); |
| 339 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 339 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
| 340 EXPECT_EQ(2, transport_->packets_sent()); | 340 EXPECT_EQ(2, transport_->packets_sent()); |
| 341 | 341 |
| 342 // Ack the first audio frame. | 342 // Ack the first audio frame. |
| 343 RtcpCastMessage cast_message; | 343 RtcpCastMessage cast_message; |
| 344 cast_message.media_ssrc = kAudioSsrc; | 344 cast_message.remote_ssrc = kAudioSsrc; |
| 345 cast_message.ack_frame_id = 1; | 345 cast_message.ack_frame_id = 1; |
| 346 transport_sender_->OnReceivedCastMessage(kAudioSsrc, | 346 transport_sender_->OnReceivedCastMessage(kAudioSsrc, |
| 347 RtcpCastMessageCallback(), | 347 RtcpCastMessageCallback(), |
| 348 cast_message); | 348 cast_message); |
| 349 task_runner_->RunTasks(); | 349 task_runner_->RunTasks(); |
| 350 EXPECT_EQ(2, transport_->packets_sent()); | 350 EXPECT_EQ(2, transport_->packets_sent()); |
| 351 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. | 351 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. |
| 352 | 352 |
| 353 // Send a fake video frame that will be decomposed into 4 packets. | 353 // Send a fake video frame that will be decomposed into 4 packets. |
| 354 EncodedFrame fake_video; | 354 EncodedFrame fake_video; |
| 355 fake_video.frame_id = 1; | 355 fake_video.frame_id = 1; |
| 356 fake_video.dependency = EncodedFrame::KEY; | 356 fake_video.dependency = EncodedFrame::KEY; |
| 357 fake_video.data.resize(5000, ' '); | 357 fake_video.data.resize(5000, ' '); |
| 358 transport_sender_->InsertFrame(kVideoSsrc, fake_video); | 358 transport_sender_->InsertFrame(kVideoSsrc, fake_video); |
| 359 task_runner_->RunTasks(); | 359 task_runner_->RunTasks(); |
| 360 EXPECT_EQ(6, transport_->packets_sent()); | 360 EXPECT_EQ(6, transport_->packets_sent()); |
| 361 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. | 361 EXPECT_EQ(0, num_times_logging_callback_called_); // Only 4 ms since last. |
| 362 | 362 |
| 363 // Retransmission is reject because audio is not acked yet. | 363 // Retransmission is reject because audio is not acked yet. |
| 364 cast_message.media_ssrc = kVideoSsrc; | 364 cast_message.remote_ssrc = kVideoSsrc; |
| 365 cast_message.ack_frame_id = 0; | 365 cast_message.ack_frame_id = 0; |
| 366 cast_message.missing_frames_and_packets[1].insert(3); | 366 cast_message.missing_frames_and_packets[1].insert(3); |
| 367 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); | 367 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 368 transport_sender_->OnReceivedCastMessage(kVideoSsrc, | 368 transport_sender_->OnReceivedCastMessage(kVideoSsrc, |
| 369 RtcpCastMessageCallback(), | 369 RtcpCastMessageCallback(), |
| 370 cast_message); | 370 cast_message); |
| 371 task_runner_->RunTasks(); | 371 task_runner_->RunTasks(); |
| 372 EXPECT_EQ(6, transport_->packets_sent()); | 372 EXPECT_EQ(6, transport_->packets_sent()); |
| 373 EXPECT_EQ(1, num_times_logging_callback_called_); | 373 EXPECT_EQ(1, num_times_logging_callback_called_); |
| 374 | 374 |
| 375 // Ack the second audio frame. | 375 // Ack the second audio frame. |
| 376 cast_message.media_ssrc = kAudioSsrc; | 376 cast_message.remote_ssrc = kAudioSsrc; |
| 377 cast_message.ack_frame_id = 2; | 377 cast_message.ack_frame_id = 2; |
| 378 cast_message.missing_frames_and_packets.clear(); | 378 cast_message.missing_frames_and_packets.clear(); |
| 379 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 379 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
| 380 transport_sender_->OnReceivedCastMessage(kAudioSsrc, | 380 transport_sender_->OnReceivedCastMessage(kAudioSsrc, |
| 381 RtcpCastMessageCallback(), | 381 RtcpCastMessageCallback(), |
| 382 cast_message); | 382 cast_message); |
| 383 task_runner_->RunTasks(); | 383 task_runner_->RunTasks(); |
| 384 EXPECT_EQ(6, transport_->packets_sent()); | 384 EXPECT_EQ(6, transport_->packets_sent()); |
| 385 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 6 ms since last. | 385 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 6 ms since last. |
| 386 | 386 |
| 387 // Retransmission of video packet now accepted. | 387 // Retransmission of video packet now accepted. |
| 388 cast_message.media_ssrc = kVideoSsrc; | 388 cast_message.remote_ssrc = kVideoSsrc; |
| 389 cast_message.ack_frame_id = 1; | 389 cast_message.ack_frame_id = 1; |
| 390 cast_message.missing_frames_and_packets[1].insert(3); | 390 cast_message.missing_frames_and_packets[1].insert(3); |
| 391 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 391 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
| 392 transport_sender_->OnReceivedCastMessage(kVideoSsrc, | 392 transport_sender_->OnReceivedCastMessage(kVideoSsrc, |
| 393 RtcpCastMessageCallback(), | 393 RtcpCastMessageCallback(), |
| 394 cast_message); | 394 cast_message); |
| 395 task_runner_->RunTasks(); | 395 task_runner_->RunTasks(); |
| 396 EXPECT_EQ(7, transport_->packets_sent()); | 396 EXPECT_EQ(7, transport_->packets_sent()); |
| 397 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 8 ms since last. | 397 EXPECT_EQ(1, num_times_logging_callback_called_); // Only 8 ms since last. |
| 398 | 398 |
| 399 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); | 399 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2)); |
| 400 EXPECT_EQ(2, num_times_logging_callback_called_); | 400 EXPECT_EQ(2, num_times_logging_callback_called_); |
| 401 } | 401 } |
| 402 | 402 |
| 403 } // namespace cast | 403 } // namespace cast |
| 404 } // namespace media | 404 } // namespace media |
| OLD | NEW |