Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 #include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h" | 23 #include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h" |
| 24 #include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h" | 24 #include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h" |
| 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" |
| 26 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" |
| 27 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h" |
| 28 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" |
| 29 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
| 30 | 30 |
| 31 namespace webrtc { | 31 namespace webrtc { |
| 32 | 32 |
| 33 namespace { | |
| 34 | |
| 33 TEST(NACKStringBuilderTest, TestCase1) { | 35 TEST(NACKStringBuilderTest, TestCase1) { |
| 34 NACKStringBuilder builder; | 36 NACKStringBuilder builder; |
| 35 builder.PushNACK(5); | 37 builder.PushNACK(5); |
| 36 builder.PushNACK(7); | 38 builder.PushNACK(7); |
| 37 builder.PushNACK(9); | 39 builder.PushNACK(9); |
| 38 builder.PushNACK(10); | 40 builder.PushNACK(10); |
| 39 builder.PushNACK(11); | 41 builder.PushNACK(11); |
| 40 builder.PushNACK(12); | 42 builder.PushNACK(12); |
| 41 builder.PushNACK(15); | 43 builder.PushNACK(15); |
| 42 builder.PushNACK(18); | 44 builder.PushNACK(18); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 265 | 267 |
| 266 int OnReceivedPayloadData(const uint8_t* payloadData, | 268 int OnReceivedPayloadData(const uint8_t* payloadData, |
| 267 const size_t payloadSize, | 269 const size_t payloadSize, |
| 268 const WebRtcRTPHeader* rtpHeader) override { | 270 const WebRtcRTPHeader* rtpHeader) override { |
| 269 return 0; | 271 return 0; |
| 270 } | 272 } |
| 271 RTCPReceiver* rtcp_receiver_; | 273 RTCPReceiver* rtcp_receiver_; |
| 272 RTCPHelp::RTCPPacketInformation rtcp_packet_info_; | 274 RTCPHelp::RTCPPacketInformation rtcp_packet_info_; |
| 273 }; | 275 }; |
| 274 | 276 |
| 277 static const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000; | |
| 278 static const int kMaxPacketLength = 1500; | |
| 279 static const uint32_t kMediaSsrc = 0x11111111; | |
| 280 | |
| 275 class RtcpSenderTest : public ::testing::Test { | 281 class RtcpSenderTest : public ::testing::Test { |
| 276 protected: | 282 protected: |
| 277 static const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000; | |
| 278 | |
| 279 RtcpSenderTest() | 283 RtcpSenderTest() |
| 280 : over_use_detector_options_(), | 284 : over_use_detector_options_(), |
| 281 clock_(1335900000), | 285 clock_(1335900000), |
| 282 rtp_payload_registry_(new RTPPayloadRegistry( | 286 rtp_payload_registry_(new RTPPayloadRegistry( |
| 283 RTPPayloadStrategy::CreateStrategy(false))), | 287 RTPPayloadStrategy::CreateStrategy(false))), |
| 284 remote_bitrate_observer_(), | 288 remote_bitrate_observer_(), |
| 285 remote_bitrate_estimator_( | 289 remote_bitrate_estimator_( |
| 286 RemoteBitrateEstimatorFactory().Create( | 290 RemoteBitrateEstimatorFactory().Create( |
| 287 &remote_bitrate_observer_, | 291 &remote_bitrate_observer_, |
| 288 &clock_, | 292 &clock_, |
| 289 kMimdControl, | 293 kMimdControl, |
| 290 kRemoteBitrateEstimatorMinBitrateBps)), | 294 kRemoteBitrateEstimatorMinBitrateBps)), |
| 291 receive_statistics_(ReceiveStatistics::Create(&clock_)) { | 295 receive_statistics_(ReceiveStatistics::Create(&clock_)) { |
| 292 test_transport_ = new TestTransport(); | 296 test_transport_ = new TestTransport(); |
| 293 | 297 |
| 294 RtpRtcp::Configuration configuration; | 298 RtpRtcp::Configuration configuration; |
| 295 configuration.id = 0; | 299 configuration.id = 0; |
| 296 configuration.audio = false; | 300 configuration.audio = false; |
| 297 configuration.clock = &clock_; | 301 configuration.clock = &clock_; |
| 298 configuration.outgoing_transport = test_transport_; | 302 configuration.outgoing_transport = test_transport_; |
| 299 configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get(); | 303 configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get(); |
| 300 | 304 |
| 301 rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration); | 305 rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration); |
| 302 rtp_receiver_.reset(RtpReceiver::CreateVideoReceiver( | 306 rtp_receiver_.reset(RtpReceiver::CreateVideoReceiver( |
| 303 0, &clock_, test_transport_, NULL, rtp_payload_registry_.get())); | 307 0, &clock_, test_transport_, NULL, rtp_payload_registry_.get())); |
| 304 rtcp_sender_ = | 308 rtcp_sender_ = |
| 305 new RTCPSender(0, false, &clock_, receive_statistics_.get(), NULL); | 309 new RTCPSender(0, false, &clock_, receive_statistics_.get(), NULL); |
| 306 rtcp_receiver_ = | 310 rtcp_receiver_ = |
| 307 new RTCPReceiver(0, &clock_, false, NULL, NULL, NULL, rtp_rtcp_impl_); | 311 new RTCPReceiver(0, &clock_, false, NULL, NULL, NULL, rtp_rtcp_impl_); |
| 312 std::set<uint32_t> registered_ssrcs; | |
| 313 registered_ssrcs.insert(kMediaSsrc); | |
|
åsapersson
2015/07/22 05:58:27
The main_ssrc should also be in the set right? And
sprang_webrtc
2015/07/23 13:50:40
I find these settings a bit confusing. Did I get i
| |
| 314 rtcp_receiver_->SetSsrcs(0, registered_ssrcs); | |
| 308 test_transport_->SetRTCPReceiver(rtcp_receiver_); | 315 test_transport_->SetRTCPReceiver(rtcp_receiver_); |
| 309 // Initialize | 316 // Initialize |
| 310 EXPECT_EQ(0, rtcp_sender_->RegisterSendTransport(test_transport_)); | 317 EXPECT_EQ(0, rtcp_sender_->RegisterSendTransport(test_transport_)); |
| 311 } | 318 } |
| 319 | |
| 312 ~RtcpSenderTest() { | 320 ~RtcpSenderTest() { |
| 313 delete rtcp_sender_; | 321 delete rtcp_sender_; |
| 314 delete rtcp_receiver_; | 322 delete rtcp_receiver_; |
| 315 delete rtp_rtcp_impl_; | 323 delete rtp_rtcp_impl_; |
| 316 delete test_transport_; | 324 delete test_transport_; |
| 317 } | 325 } |
| 318 | 326 |
| 319 // Helper function: Incoming RTCP has a specific packet type. | 327 // Helper function: Incoming RTCP has a specific packet type. |
| 320 bool gotPacketType(RTCPPacketType packet_type) { | 328 bool gotPacketType(RTCPPacketType packet_type) { |
| 321 return ((test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags) & | 329 return ((test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags) & |
| 322 packet_type) != 0U; | 330 packet_type) != 0U; |
| 323 } | 331 } |
| 324 | 332 |
| 325 OverUseDetectorOptions over_use_detector_options_; | 333 OverUseDetectorOptions over_use_detector_options_; |
| 326 SimulatedClock clock_; | 334 SimulatedClock clock_; |
| 327 rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_; | 335 rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_; |
| 328 rtc::scoped_ptr<RtpReceiver> rtp_receiver_; | 336 rtc::scoped_ptr<RtpReceiver> rtp_receiver_; |
| 329 ModuleRtpRtcpImpl* rtp_rtcp_impl_; | 337 ModuleRtpRtcpImpl* rtp_rtcp_impl_; |
| 330 RTCPSender* rtcp_sender_; | 338 RTCPSender* rtcp_sender_; |
| 331 RTCPReceiver* rtcp_receiver_; | 339 RTCPReceiver* rtcp_receiver_; |
| 332 TestTransport* test_transport_; | 340 TestTransport* test_transport_; |
| 333 MockRemoteBitrateObserver remote_bitrate_observer_; | 341 MockRemoteBitrateObserver remote_bitrate_observer_; |
| 334 rtc::scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_; | 342 rtc::scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_; |
| 335 rtc::scoped_ptr<ReceiveStatistics> receive_statistics_; | 343 rtc::scoped_ptr<ReceiveStatistics> receive_statistics_; |
| 336 | 344 |
| 337 enum {kMaxPacketLength = 1500}; | |
| 338 uint8_t packet_[kMaxPacketLength]; | 345 uint8_t packet_[kMaxPacketLength]; |
| 339 }; | 346 }; |
| 340 | 347 |
| 341 TEST_F(RtcpSenderTest, RtcpOff) { | 348 TEST_F(RtcpSenderTest, RtcpOff) { |
| 342 rtcp_sender_->SetRTCPStatus(kRtcpOff); | 349 rtcp_sender_->SetRTCPStatus(kRtcpOff); |
| 343 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); | 350 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); |
| 344 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr)); | 351 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr)); |
| 345 } | 352 } |
| 346 | 353 |
| 347 TEST_F(RtcpSenderTest, IJStatus) { | |
| 348 ASSERT_FALSE(rtcp_sender_->IJ()); | |
| 349 rtcp_sender_->SetIJStatus(true); | |
| 350 EXPECT_TRUE(rtcp_sender_->IJ()); | |
| 351 } | |
| 352 | |
| 353 TEST_F(RtcpSenderTest, TestCompound) { | 354 TEST_F(RtcpSenderTest, TestCompound) { |
| 354 const bool marker_bit = false; | 355 const bool marker_bit = false; |
| 355 const uint8_t payload_type = 100; | 356 const uint8_t payload_type = 100; |
| 356 const uint16_t seq_num = 11111; | 357 const uint16_t seq_num = 11111; |
| 357 const uint32_t timestamp = 1234567; | 358 const uint32_t timestamp = 1234567; |
| 358 const uint32_t ssrc = 0x11111111; | |
| 359 size_t packet_length = 0; | 359 size_t packet_length = 0; |
| 360 CreateRtpPacket(marker_bit, payload_type, seq_num, timestamp, ssrc, packet_, | 360 CreateRtpPacket(marker_bit, payload_type, seq_num, timestamp, kMediaSsrc, |
| 361 &packet_length); | 361 packet_, &packet_length); |
| 362 EXPECT_EQ(25u, packet_length); | 362 EXPECT_EQ(25u, packet_length); |
| 363 | 363 |
| 364 VideoCodec codec_inst; | 364 VideoCodec codec_inst; |
| 365 strncpy(codec_inst.plName, "VP8", webrtc::kPayloadNameSize - 1); | 365 strncpy(codec_inst.plName, "VP8", webrtc::kPayloadNameSize - 1); |
| 366 codec_inst.codecType = webrtc::kVideoCodecVP8; | 366 codec_inst.codecType = webrtc::kVideoCodecVP8; |
| 367 codec_inst.plType = payload_type; | 367 codec_inst.plType = payload_type; |
| 368 EXPECT_EQ(0, rtp_receiver_->RegisterReceivePayload(codec_inst.plName, | 368 EXPECT_EQ(0, rtp_receiver_->RegisterReceivePayload(codec_inst.plName, |
| 369 codec_inst.plType, | 369 codec_inst.plType, |
| 370 90000, | 370 90000, |
| 371 0, | 371 0, |
| 372 codec_inst.maxBitrate)); | 372 codec_inst.maxBitrate)); |
| 373 | 373 |
| 374 // Make sure RTP packet has been received. | 374 // Make sure RTP packet has been received. |
| 375 rtc::scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); | 375 rtc::scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
| 376 RTPHeader header; | 376 RTPHeader header; |
| 377 EXPECT_TRUE(parser->Parse(packet_, packet_length, &header)); | 377 EXPECT_TRUE(parser->Parse(packet_, packet_length, &header)); |
| 378 PayloadUnion payload_specific; | 378 PayloadUnion payload_specific; |
| 379 EXPECT_TRUE(rtp_payload_registry_->GetPayloadSpecifics(header.payloadType, | 379 EXPECT_TRUE(rtp_payload_registry_->GetPayloadSpecifics(header.payloadType, |
| 380 &payload_specific)); | 380 &payload_specific)); |
| 381 receive_statistics_->IncomingPacket(header, packet_length, false); | 381 receive_statistics_->IncomingPacket(header, packet_length, false); |
| 382 EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(header, packet_, packet_length, | 382 EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(header, packet_, packet_length, |
| 383 payload_specific, true)); | 383 payload_specific, true)); |
| 384 | 384 |
| 385 rtcp_sender_->SetIJStatus(true); | 385 rtcp_sender_->SetCNAME("Foo"); |
| 386 rtcp_sender_->SetRTCPStatus(kRtcpCompound); | 386 rtcp_sender_->SetRTCPStatus(kRtcpCompound); |
| 387 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); | 387 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); |
| 388 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRr)); | 388 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRr)); |
| 389 | 389 |
| 390 // Transmission time offset packet should be received. | 390 // Sdes packet should be received, along with report blocks. |
| 391 ASSERT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags & | 391 ASSERT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags & |
| 392 kRtcpTransmissionTimeOffset); | 392 kRtcpSdes); |
| 393 EXPECT_GT(test_transport_->rtcp_packet_info_.report_blocks.size(), 0u); | |
| 393 } | 394 } |
| 394 | 395 |
| 395 TEST_F(RtcpSenderTest, TestCompound_NoRtpReceived) { | 396 TEST_F(RtcpSenderTest, TestCompound_NoRtpReceived) { |
| 396 rtcp_sender_->SetIJStatus(true); | 397 rtcp_sender_->SetCNAME("Foo"); |
| 397 rtcp_sender_->SetRTCPStatus(kRtcpCompound); | 398 rtcp_sender_->SetRTCPStatus(kRtcpCompound); |
| 398 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); | 399 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); |
| 399 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRr)); | 400 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRr)); |
| 400 | 401 |
| 401 // Transmission time offset packet should not be received. | 402 // Sdes should be received, but no report blocks. |
| 402 ASSERT_FALSE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags & | 403 ASSERT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags & |
| 403 kRtcpTransmissionTimeOffset); | 404 kRtcpSdes); |
| 405 EXPECT_EQ(0u, test_transport_->rtcp_packet_info_.report_blocks.size()); | |
| 404 } | 406 } |
| 405 | 407 |
| 406 TEST_F(RtcpSenderTest, TestXrReceiverReferenceTime) { | 408 TEST_F(RtcpSenderTest, TestXrReceiverReferenceTime) { |
| 407 rtcp_sender_->SetRTCPStatus(kRtcpCompound); | 409 rtcp_sender_->SetRTCPStatus(kRtcpCompound); |
| 408 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); | 410 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); |
| 409 EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false)); | 411 EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false)); |
| 410 rtcp_sender_->SendRtcpXrReceiverReferenceTime(true); | 412 rtcp_sender_->SendRtcpXrReceiverReferenceTime(true); |
| 411 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport)); | 413 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport)); |
| 412 | 414 |
| 413 EXPECT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags & | 415 EXPECT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags & |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 507 // test_transport_. | 509 // test_transport_. |
| 508 ASSERT_NE(0U, test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags); | 510 ASSERT_NE(0U, test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags); |
| 509 EXPECT_TRUE(gotPacketType(kRtcpTmmbn)); | 511 EXPECT_TRUE(gotPacketType(kRtcpTmmbn)); |
| 510 TMMBRSet incoming_set; | 512 TMMBRSet incoming_set; |
| 511 bool owner = false; | 513 bool owner = false; |
| 512 // We expect 1 member of the incoming set. | 514 // We expect 1 member of the incoming set. |
| 513 EXPECT_EQ(1, test_transport_->rtcp_receiver_->BoundingSet(owner, | 515 EXPECT_EQ(1, test_transport_->rtcp_receiver_->BoundingSet(owner, |
| 514 &incoming_set)); | 516 &incoming_set)); |
| 515 EXPECT_EQ(kSourceSsrc, incoming_set.Ssrc(0)); | 517 EXPECT_EQ(kSourceSsrc, incoming_set.Ssrc(0)); |
| 516 } | 518 } |
| 519 | |
| 520 } // namespace | |
| 517 } // namespace webrtc | 521 } // namespace webrtc |
| OLD | NEW |