| 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 <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include "base/test/simple_test_tick_clock.h" | 7 #include "base/test/simple_test_tick_clock.h" |
| 8 #include "media/cast/cast_defines.h" | 8 #include "media/cast/cast_defines.h" |
| 9 #include "media/cast/net/cast_transport_config.h" | 9 #include "media/cast/net/cast_transport_config.h" |
| 10 #include "media/cast/net/cast_transport_sender_impl.h" | 10 #include "media/cast/net/cast_transport_sender_impl.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 return true; | 52 return true; |
| 53 | 53 |
| 54 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | 54 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); |
| 55 return true; | 55 return true; |
| 56 } | 56 } |
| 57 | 57 |
| 58 private: | 58 private: |
| 59 bool drop_packets_; | 59 bool drop_packets_; |
| 60 bool short_delay_; | 60 bool short_delay_; |
| 61 Rtcp* rtcp_receiver_; | 61 Rtcp* rtcp_receiver_; |
| 62 base::SimpleTestTickClock* testing_clock_; | 62 base::SimpleTestTickClock* testing_clock_; // Not owned. |
| 63 | 63 |
| 64 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); | 64 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); |
| 65 }; | 65 }; |
| 66 | 66 |
| 67 class LocalRtcpTransport : public PacedPacketSender { | 67 class LocalRtcpTransport : public PacedPacketSender { |
| 68 public: | 68 public: |
| 69 explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock) | 69 explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock) |
| 70 : drop_packets_(false), | 70 : drop_packets_(false), |
| 71 short_delay_(false), | 71 short_delay_(false), |
| 72 testing_clock_(testing_clock) {} | 72 testing_clock_(testing_clock) {} |
| (...skipping 30 matching lines...) Expand all Loading... |
| 103 } | 103 } |
| 104 | 104 |
| 105 virtual void CancelSendingPacket( | 105 virtual void CancelSendingPacket( |
| 106 const PacketKey& packet_key) OVERRIDE { | 106 const PacketKey& packet_key) OVERRIDE { |
| 107 } | 107 } |
| 108 | 108 |
| 109 private: | 109 private: |
| 110 bool drop_packets_; | 110 bool drop_packets_; |
| 111 bool short_delay_; | 111 bool short_delay_; |
| 112 Rtcp* rtcp_; | 112 Rtcp* rtcp_; |
| 113 base::SimpleTestTickClock* testing_clock_; | 113 base::SimpleTestTickClock* testing_clock_; // Not owned. |
| 114 | 114 |
| 115 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); | 115 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); |
| 116 }; | 116 }; |
| 117 | 117 |
| 118 class MockReceiverStats : public RtpReceiverStatistics { | 118 class MockReceiverStats : public RtpReceiverStatistics { |
| 119 public: | 119 public: |
| 120 MockReceiverStats() {} | 120 MockReceiverStats() {} |
| 121 virtual ~MockReceiverStats() {} | 121 virtual ~MockReceiverStats() {} |
| 122 | 122 |
| 123 virtual void GetStatistics(uint8* fraction_lost, | 123 virtual void GetStatistics(uint8* fraction_lost, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 147 base::TimeDelta min_rtt, | 147 base::TimeDelta min_rtt, |
| 148 base::TimeDelta max_rtt)); | 148 base::TimeDelta max_rtt)); |
| 149 private: | 149 private: |
| 150 DISALLOW_COPY_AND_ASSIGN(MockFrameSender); | 150 DISALLOW_COPY_AND_ASSIGN(MockFrameSender); |
| 151 }; | 151 }; |
| 152 | 152 |
| 153 class RtcpTest : public ::testing::Test { | 153 class RtcpTest : public ::testing::Test { |
| 154 protected: | 154 protected: |
| 155 RtcpTest() | 155 RtcpTest() |
| 156 : testing_clock_(new base::SimpleTestTickClock()), | 156 : testing_clock_(new base::SimpleTestTickClock()), |
| 157 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | 157 task_runner_( |
| 158 sender_to_receiver_(testing_clock_), | 158 new test::FakeSingleThreadTaskRunner(testing_clock_.get())), |
| 159 receiver_to_sender_(testing_clock_) { | 159 sender_to_receiver_(testing_clock_.get()), |
| 160 receiver_to_sender_(testing_clock_.get()) { |
| 160 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 161 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
| 161 } | 162 } |
| 162 | 163 |
| 163 virtual ~RtcpTest() {} | 164 virtual ~RtcpTest() {} |
| 164 | 165 |
| 165 static void UpdateCastTransportStatus(CastTransportStatus status) { | 166 static void UpdateCastTransportStatus(CastTransportStatus status) { |
| 166 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || | 167 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || |
| 167 status == TRANSPORT_VIDEO_INITIALIZED); | 168 status == TRANSPORT_VIDEO_INITIALIZED); |
| 168 EXPECT_TRUE(result); | 169 EXPECT_TRUE(result); |
| 169 } | 170 } |
| 170 | 171 |
| 171 void RunTasks(int during_ms) { | 172 void RunTasks(int during_ms) { |
| 172 for (int i = 0; i < during_ms; ++i) { | 173 for (int i = 0; i < during_ms; ++i) { |
| 173 // Call process the timers every 1 ms. | 174 // Call process the timers every 1 ms. |
| 174 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); | 175 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); |
| 175 task_runner_->RunTasks(); | 176 task_runner_->RunTasks(); |
| 176 } | 177 } |
| 177 } | 178 } |
| 178 | 179 |
| 179 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | 180 scoped_ptr<base::SimpleTestTickClock> testing_clock_; |
| 180 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 181 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 181 LocalRtcpTransport sender_to_receiver_; | 182 LocalRtcpTransport sender_to_receiver_; |
| 182 LocalRtcpTransport receiver_to_sender_; | 183 LocalRtcpTransport receiver_to_sender_; |
| 183 MockFrameSender mock_frame_sender_; | 184 MockFrameSender mock_frame_sender_; |
| 184 MockReceiverStats stats_; | 185 MockReceiverStats stats_; |
| 185 | 186 |
| 186 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 187 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
| 187 }; | 188 }; |
| 188 | 189 |
| 189 TEST_F(RtcpTest, BasicSenderReport) { | 190 TEST_F(RtcpTest, BasicSenderReport) { |
| 190 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 191 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
| 191 base::Unretained(&mock_frame_sender_)), | 192 base::Unretained(&mock_frame_sender_)), |
| 192 base::Bind(&MockFrameSender::OnReceivedRtt, | 193 base::Bind(&MockFrameSender::OnReceivedRtt, |
| 193 base::Unretained(&mock_frame_sender_)), | 194 base::Unretained(&mock_frame_sender_)), |
| 194 RtcpLogMessageCallback(), | 195 RtcpLogMessageCallback(), |
| 195 testing_clock_, | 196 testing_clock_.get(), |
| 196 &sender_to_receiver_, | 197 &sender_to_receiver_, |
| 197 kSenderSsrc, | 198 kSenderSsrc, |
| 198 kReceiverSsrc); | 199 kReceiverSsrc); |
| 199 sender_to_receiver_.set_rtcp_receiver(&rtcp); | 200 sender_to_receiver_.set_rtcp_receiver(&rtcp); |
| 200 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0, 1, 1); | 201 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0, 1, 1); |
| 201 } | 202 } |
| 202 | 203 |
| 203 TEST_F(RtcpTest, BasicReceiverReport) { | 204 TEST_F(RtcpTest, BasicReceiverReport) { |
| 204 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 205 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
| 205 base::Unretained(&mock_frame_sender_)), | 206 base::Unretained(&mock_frame_sender_)), |
| 206 base::Bind(&MockFrameSender::OnReceivedRtt, | 207 base::Bind(&MockFrameSender::OnReceivedRtt, |
| 207 base::Unretained(&mock_frame_sender_)), | 208 base::Unretained(&mock_frame_sender_)), |
| 208 RtcpLogMessageCallback(), | 209 RtcpLogMessageCallback(), |
| 209 testing_clock_, | 210 testing_clock_.get(), |
| 210 &receiver_to_sender_, | 211 &receiver_to_sender_, |
| 211 kSenderSsrc, | 212 kSenderSsrc, |
| 212 kReceiverSsrc); | 213 kReceiverSsrc); |
| 213 receiver_to_sender_.set_rtcp_receiver(&rtcp); | 214 receiver_to_sender_.set_rtcp_receiver(&rtcp); |
| 214 rtcp.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | 215 rtcp.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); |
| 215 } | 216 } |
| 216 | 217 |
| 217 TEST_F(RtcpTest, BasicCast) { | 218 TEST_F(RtcpTest, BasicCast) { |
| 218 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)).Times(1); | 219 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)).Times(1); |
| 219 | 220 |
| 220 // Media sender. | 221 // Media sender. |
| 221 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 222 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
| 222 base::Unretained(&mock_frame_sender_)), | 223 base::Unretained(&mock_frame_sender_)), |
| 223 base::Bind(&MockFrameSender::OnReceivedRtt, | 224 base::Bind(&MockFrameSender::OnReceivedRtt, |
| 224 base::Unretained(&mock_frame_sender_)), | 225 base::Unretained(&mock_frame_sender_)), |
| 225 RtcpLogMessageCallback(), | 226 RtcpLogMessageCallback(), |
| 226 testing_clock_, | 227 testing_clock_.get(), |
| 227 &receiver_to_sender_, | 228 &receiver_to_sender_, |
| 228 kSenderSsrc, | 229 kSenderSsrc, |
| 229 kSenderSsrc); | 230 kSenderSsrc); |
| 230 receiver_to_sender_.set_rtcp_receiver(&rtcp); | 231 receiver_to_sender_.set_rtcp_receiver(&rtcp); |
| 231 RtcpCastMessage cast_message(kSenderSsrc); | 232 RtcpCastMessage cast_message(kSenderSsrc); |
| 232 cast_message.ack_frame_id = kAckFrameId; | 233 cast_message.ack_frame_id = kAckFrameId; |
| 233 PacketIdSet missing_packets; | 234 PacketIdSet missing_packets; |
| 234 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; | 235 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; |
| 235 | 236 |
| 236 missing_packets.insert(kLostPacketId1); | 237 missing_packets.insert(kLostPacketId1); |
| 237 missing_packets.insert(kLostPacketId2); | 238 missing_packets.insert(kLostPacketId2); |
| 238 missing_packets.insert(kLostPacketId3); | 239 missing_packets.insert(kLostPacketId3); |
| 239 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = | 240 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = |
| 240 missing_packets; | 241 missing_packets; |
| 241 rtcp.SendRtcpFromRtpReceiver(&cast_message, base::TimeDelta(), NULL, NULL); | 242 rtcp.SendRtcpFromRtpReceiver(&cast_message, base::TimeDelta(), NULL, NULL); |
| 242 } | 243 } |
| 243 | 244 |
| 244 TEST_F(RtcpTest, RttReducedSizeRtcp) { | 245 TEST_F(RtcpTest, RttReducedSizeRtcp) { |
| 245 // Media receiver. | 246 // Media receiver. |
| 246 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | 247 Rtcp rtcp_receiver(RtcpCastMessageCallback(), |
| 247 RtcpRttCallback(), | 248 RtcpRttCallback(), |
| 248 RtcpLogMessageCallback(), | 249 RtcpLogMessageCallback(), |
| 249 testing_clock_, | 250 testing_clock_.get(), |
| 250 &receiver_to_sender_, | 251 &receiver_to_sender_, |
| 251 kReceiverSsrc, | 252 kReceiverSsrc, |
| 252 kSenderSsrc); | 253 kSenderSsrc); |
| 253 | 254 |
| 254 // Media sender. | 255 // Media sender. |
| 255 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 256 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
| 256 base::Unretained(&mock_frame_sender_)), | 257 base::Unretained(&mock_frame_sender_)), |
| 257 base::Bind(&MockFrameSender::OnReceivedRtt, | 258 base::Bind(&MockFrameSender::OnReceivedRtt, |
| 258 base::Unretained(&mock_frame_sender_)), | 259 base::Unretained(&mock_frame_sender_)), |
| 259 RtcpLogMessageCallback(), | 260 RtcpLogMessageCallback(), |
| 260 testing_clock_, | 261 testing_clock_.get(), |
| 261 &sender_to_receiver_, | 262 &sender_to_receiver_, |
| 262 kSenderSsrc, | 263 kSenderSsrc, |
| 263 kReceiverSsrc); | 264 kReceiverSsrc); |
| 264 | 265 |
| 265 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | 266 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); |
| 266 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | 267 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); |
| 267 | 268 |
| 268 base::TimeDelta rtt; | 269 base::TimeDelta rtt; |
| 269 base::TimeDelta avg_rtt; | 270 base::TimeDelta avg_rtt; |
| 270 base::TimeDelta min_rtt; | 271 base::TimeDelta min_rtt; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 289 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); | 290 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); |
| 290 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); | 291 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); |
| 291 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | 292 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); |
| 292 } | 293 } |
| 293 | 294 |
| 294 TEST_F(RtcpTest, Rtt) { | 295 TEST_F(RtcpTest, Rtt) { |
| 295 // Media receiver. | 296 // Media receiver. |
| 296 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | 297 Rtcp rtcp_receiver(RtcpCastMessageCallback(), |
| 297 RtcpRttCallback(), | 298 RtcpRttCallback(), |
| 298 RtcpLogMessageCallback(), | 299 RtcpLogMessageCallback(), |
| 299 testing_clock_, | 300 testing_clock_.get(), |
| 300 &receiver_to_sender_, | 301 &receiver_to_sender_, |
| 301 kReceiverSsrc, | 302 kReceiverSsrc, |
| 302 kSenderSsrc); | 303 kSenderSsrc); |
| 303 | 304 |
| 304 // Media sender. | 305 // Media sender. |
| 305 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 306 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
| 306 base::Unretained(&mock_frame_sender_)), | 307 base::Unretained(&mock_frame_sender_)), |
| 307 base::Bind(&MockFrameSender::OnReceivedRtt, | 308 base::Bind(&MockFrameSender::OnReceivedRtt, |
| 308 base::Unretained(&mock_frame_sender_)), | 309 base::Unretained(&mock_frame_sender_)), |
| 309 RtcpLogMessageCallback(), | 310 RtcpLogMessageCallback(), |
| 310 testing_clock_, | 311 testing_clock_.get(), |
| 311 &sender_to_receiver_, | 312 &sender_to_receiver_, |
| 312 kSenderSsrc, | 313 kSenderSsrc, |
| 313 kReceiverSsrc); | 314 kReceiverSsrc); |
| 314 | 315 |
| 315 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | 316 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); |
| 316 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | 317 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); |
| 317 | 318 |
| 318 base::TimeDelta rtt; | 319 base::TimeDelta rtt; |
| 319 base::TimeDelta avg_rtt; | 320 base::TimeDelta avg_rtt; |
| 320 base::TimeDelta min_rtt; | 321 base::TimeDelta min_rtt; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); | 377 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); |
| 377 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); | 378 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); |
| 378 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | 379 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); |
| 379 } | 380 } |
| 380 | 381 |
| 381 TEST_F(RtcpTest, RttWithPacketLoss) { | 382 TEST_F(RtcpTest, RttWithPacketLoss) { |
| 382 // Media receiver. | 383 // Media receiver. |
| 383 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | 384 Rtcp rtcp_receiver(RtcpCastMessageCallback(), |
| 384 RtcpRttCallback(), | 385 RtcpRttCallback(), |
| 385 RtcpLogMessageCallback(), | 386 RtcpLogMessageCallback(), |
| 386 testing_clock_, | 387 testing_clock_.get(), |
| 387 &receiver_to_sender_, | 388 &receiver_to_sender_, |
| 388 kReceiverSsrc, | 389 kReceiverSsrc, |
| 389 kSenderSsrc); | 390 kSenderSsrc); |
| 390 | 391 |
| 391 // Media sender. | 392 // Media sender. |
| 392 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 393 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
| 393 base::Unretained(&mock_frame_sender_)), | 394 base::Unretained(&mock_frame_sender_)), |
| 394 base::Bind(&MockFrameSender::OnReceivedRtt, | 395 base::Bind(&MockFrameSender::OnReceivedRtt, |
| 395 base::Unretained(&mock_frame_sender_)), | 396 base::Unretained(&mock_frame_sender_)), |
| 396 RtcpLogMessageCallback(), | 397 RtcpLogMessageCallback(), |
| 397 testing_clock_, | 398 testing_clock_.get(), |
| 398 &sender_to_receiver_, | 399 &sender_to_receiver_, |
| 399 kSenderSsrc, | 400 kSenderSsrc, |
| 400 kReceiverSsrc); | 401 kReceiverSsrc); |
| 401 | 402 |
| 402 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | 403 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); |
| 403 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | 404 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); |
| 404 | 405 |
| 405 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | 406 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); |
| 406 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0, 1, 1); | 407 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0, 1, 1); |
| 407 RunTasks(33); | 408 RunTasks(33); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | 471 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
| 471 EXPECT_EQ(input_time, out_3); // Verify inverse. | 472 EXPECT_EQ(input_time, out_3); // Verify inverse. |
| 472 | 473 |
| 473 // Verify delta. | 474 // Verify delta. |
| 474 EXPECT_EQ((out_3 - out_2), time_delta); | 475 EXPECT_EQ((out_3 - out_2), time_delta); |
| 475 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | 476 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
| 476 } | 477 } |
| 477 | 478 |
| 478 } // namespace cast | 479 } // namespace cast |
| 479 } // namespace media | 480 } // namespace media |
| OLD | NEW |