OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 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 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 offer_answer_constraints_.SetMandatoryReceiveVideo(video); | 380 offer_answer_constraints_.SetMandatoryReceiveVideo(video); |
381 offer_answer_options_.offer_to_receive_video = video ? 1 : 0; | 381 offer_answer_options_.offer_to_receive_video = video ? 1 : 0; |
382 } | 382 } |
383 | 383 |
384 void RemoveMsidFromReceivedSdp(bool remove) { remove_msid_ = remove; } | 384 void RemoveMsidFromReceivedSdp(bool remove) { remove_msid_ = remove; } |
385 | 385 |
386 void RemoveSdesCryptoFromReceivedSdp(bool remove) { remove_sdes_ = remove; } | 386 void RemoveSdesCryptoFromReceivedSdp(bool remove) { remove_sdes_ = remove; } |
387 | 387 |
388 void RemoveBundleFromReceivedSdp(bool remove) { remove_bundle_ = remove; } | 388 void RemoveBundleFromReceivedSdp(bool remove) { remove_bundle_ = remove; } |
389 | 389 |
| 390 void RemoveCvoFromReceivedSdp(bool remove) { remove_cvo_ = remove; } |
| 391 |
390 bool can_receive_audio() { | 392 bool can_receive_audio() { |
391 bool value; | 393 bool value; |
392 if (prefer_constraint_apis_) { | 394 if (prefer_constraint_apis_) { |
393 if (webrtc::FindConstraint( | 395 if (webrtc::FindConstraint( |
394 &offer_answer_constraints_, | 396 &offer_answer_constraints_, |
395 MediaConstraintsInterface::kOfferToReceiveAudio, &value, | 397 MediaConstraintsInterface::kOfferToReceiveAudio, &value, |
396 nullptr)) { | 398 nullptr)) { |
397 return value; | 399 return value; |
398 } | 400 } |
399 return true; | 401 return true; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 } | 447 } |
446 | 448 |
447 rtc::scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack( | 449 rtc::scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack( |
448 const std::string& stream_label) { | 450 const std::string& stream_label) { |
449 // Set max frame rate to 10fps to reduce the risk of the tests to be flaky. | 451 // Set max frame rate to 10fps to reduce the risk of the tests to be flaky. |
450 FakeConstraints source_constraints = video_constraints_; | 452 FakeConstraints source_constraints = video_constraints_; |
451 source_constraints.SetMandatoryMaxFrameRate(10); | 453 source_constraints.SetMandatoryMaxFrameRate(10); |
452 | 454 |
453 cricket::FakeVideoCapturer* fake_capturer = | 455 cricket::FakeVideoCapturer* fake_capturer = |
454 new webrtc::FakePeriodicVideoCapturer(); | 456 new webrtc::FakePeriodicVideoCapturer(); |
| 457 fake_capturer->SetRotation(capture_rotation_); |
455 video_capturers_.push_back(fake_capturer); | 458 video_capturers_.push_back(fake_capturer); |
456 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source = | 459 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source = |
457 peer_connection_factory_->CreateVideoSource(fake_capturer, | 460 peer_connection_factory_->CreateVideoSource(fake_capturer, |
458 &source_constraints); | 461 &source_constraints); |
459 std::string label = stream_label + kVideoTrackLabelBase; | 462 std::string label = stream_label + kVideoTrackLabelBase; |
460 return peer_connection_factory_->CreateVideoTrack(label, source); | 463 |
| 464 rtc::scoped_refptr<webrtc::VideoTrackInterface> track( |
| 465 peer_connection_factory_->CreateVideoTrack(label, source)); |
| 466 if (!local_video_renderer_) { |
| 467 local_video_renderer_.reset(new webrtc::FakeVideoTrackRenderer(track)); |
| 468 } |
| 469 return track; |
461 } | 470 } |
462 | 471 |
463 DataChannelInterface* data_channel() { return data_channel_; } | 472 DataChannelInterface* data_channel() { return data_channel_; } |
464 const MockDataChannelObserver* data_observer() const { | 473 const MockDataChannelObserver* data_observer() const { |
465 return data_observer_.get(); | 474 return data_observer_.get(); |
466 } | 475 } |
467 | 476 |
468 webrtc::PeerConnectionInterface* pc() const { return peer_connection_.get(); } | 477 webrtc::PeerConnectionInterface* pc() const { return peer_connection_.get(); } |
469 | 478 |
470 void StopVideoCapturers() { | 479 void StopVideoCapturers() { |
471 for (std::vector<cricket::VideoCapturer*>::iterator it = | 480 for (auto* capturer : video_capturers_) { |
472 video_capturers_.begin(); | 481 capturer->Stop(); |
473 it != video_capturers_.end(); ++it) { | |
474 (*it)->Stop(); | |
475 } | 482 } |
476 } | 483 } |
477 | 484 |
| 485 void SetCaptureRotation(webrtc::VideoRotation rotation) { |
| 486 ASSERT_TRUE(video_capturers_.empty()); |
| 487 capture_rotation_ = rotation; |
| 488 } |
| 489 |
478 bool AudioFramesReceivedCheck(int number_of_frames) const { | 490 bool AudioFramesReceivedCheck(int number_of_frames) const { |
479 return number_of_frames <= fake_audio_capture_module_->frames_received(); | 491 return number_of_frames <= fake_audio_capture_module_->frames_received(); |
480 } | 492 } |
481 | 493 |
482 int audio_frames_received() const { | 494 int audio_frames_received() const { |
483 return fake_audio_capture_module_->frames_received(); | 495 return fake_audio_capture_module_->frames_received(); |
484 } | 496 } |
485 | 497 |
486 bool VideoFramesReceivedCheck(int number_of_frames) { | 498 bool VideoFramesReceivedCheck(int number_of_frames) { |
487 if (video_decoder_factory_enabled_) { | 499 if (video_decoder_factory_enabled_) { |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 return fake_video_renderers_.empty() ? 1 : | 710 return fake_video_renderers_.empty() ? 1 : |
699 fake_video_renderers_.begin()->second->width(); | 711 fake_video_renderers_.begin()->second->width(); |
700 } | 712 } |
701 | 713 |
702 int rendered_height() { | 714 int rendered_height() { |
703 EXPECT_FALSE(fake_video_renderers_.empty()); | 715 EXPECT_FALSE(fake_video_renderers_.empty()); |
704 return fake_video_renderers_.empty() ? 1 : | 716 return fake_video_renderers_.empty() ? 1 : |
705 fake_video_renderers_.begin()->second->height(); | 717 fake_video_renderers_.begin()->second->height(); |
706 } | 718 } |
707 | 719 |
| 720 webrtc::VideoRotation rendered_rotation() { |
| 721 EXPECT_FALSE(fake_video_renderers_.empty()); |
| 722 return fake_video_renderers_.empty() |
| 723 ? webrtc::kVideoRotation_0 |
| 724 : fake_video_renderers_.begin()->second->rotation(); |
| 725 } |
| 726 |
| 727 int local_rendered_width() { |
| 728 return local_video_renderer_ ? local_video_renderer_->width() : 1; |
| 729 } |
| 730 |
| 731 int local_rendered_height() { |
| 732 return local_video_renderer_ ? local_video_renderer_->height() : 1; |
| 733 } |
| 734 |
708 size_t number_of_remote_streams() { | 735 size_t number_of_remote_streams() { |
709 if (!pc()) | 736 if (!pc()) |
710 return 0; | 737 return 0; |
711 return pc()->remote_streams()->count(); | 738 return pc()->remote_streams()->count(); |
712 } | 739 } |
713 | 740 |
714 StreamCollectionInterface* remote_streams() const { | 741 StreamCollectionInterface* remote_streams() const { |
715 if (!pc()) { | 742 if (!pc()) { |
716 ADD_FAILURE(); | 743 ADD_FAILURE(); |
717 return nullptr; | 744 return nullptr; |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
922 RemoveLinesFromSdp(kSdpMsidSupportedAttribute, sdp); | 949 RemoveLinesFromSdp(kSdpMsidSupportedAttribute, sdp); |
923 } | 950 } |
924 if (remove_bundle_) { | 951 if (remove_bundle_) { |
925 const char kSdpBundleAttribute[] = "a=group:BUNDLE"; | 952 const char kSdpBundleAttribute[] = "a=group:BUNDLE"; |
926 RemoveLinesFromSdp(kSdpBundleAttribute, sdp); | 953 RemoveLinesFromSdp(kSdpBundleAttribute, sdp); |
927 } | 954 } |
928 if (remove_sdes_) { | 955 if (remove_sdes_) { |
929 const char kSdpSdesCryptoAttribute[] = "a=crypto"; | 956 const char kSdpSdesCryptoAttribute[] = "a=crypto"; |
930 RemoveLinesFromSdp(kSdpSdesCryptoAttribute, sdp); | 957 RemoveLinesFromSdp(kSdpSdesCryptoAttribute, sdp); |
931 } | 958 } |
| 959 if (remove_cvo_) { |
| 960 const char kSdpCvoExtenstion[] = "urn:3gpp:video-orientation"; |
| 961 RemoveLinesFromSdp(kSdpCvoExtenstion, sdp); |
| 962 } |
932 } | 963 } |
933 | 964 |
934 std::string id_; | 965 std::string id_; |
935 | 966 |
936 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; | 967 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; |
937 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> | 968 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> |
938 peer_connection_factory_; | 969 peer_connection_factory_; |
939 | 970 |
940 bool prefer_constraint_apis_ = true; | 971 bool prefer_constraint_apis_ = true; |
941 bool auto_add_stream_ = true; | 972 bool auto_add_stream_ = true; |
(...skipping 15 matching lines...) Expand all Loading... |
957 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr; | 988 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr; |
958 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr; | 989 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr; |
959 bool video_decoder_factory_enabled_ = false; | 990 bool video_decoder_factory_enabled_ = false; |
960 webrtc::FakeConstraints video_constraints_; | 991 webrtc::FakeConstraints video_constraints_; |
961 | 992 |
962 // For remote peer communication. | 993 // For remote peer communication. |
963 SignalingMessageReceiver* signaling_message_receiver_ = nullptr; | 994 SignalingMessageReceiver* signaling_message_receiver_ = nullptr; |
964 | 995 |
965 // Store references to the video capturers we've created, so that we can stop | 996 // Store references to the video capturers we've created, so that we can stop |
966 // them, if required. | 997 // them, if required. |
967 std::vector<cricket::VideoCapturer*> video_capturers_; | 998 std::vector<cricket::FakeVideoCapturer*> video_capturers_; |
| 999 webrtc::VideoRotation capture_rotation_ = webrtc::kVideoRotation_0; |
| 1000 // |local_video_renderer_| attached to the first created local video track. |
| 1001 rtc::scoped_ptr<webrtc::FakeVideoTrackRenderer> local_video_renderer_; |
968 | 1002 |
969 webrtc::FakeConstraints offer_answer_constraints_; | 1003 webrtc::FakeConstraints offer_answer_constraints_; |
970 PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options_; | 1004 PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options_; |
971 bool remove_msid_ = false; // True if MSID should be removed in received SDP. | 1005 bool remove_msid_ = false; // True if MSID should be removed in received SDP. |
972 bool remove_bundle_ = | 1006 bool remove_bundle_ = |
973 false; // True if bundle should be removed in received SDP. | 1007 false; // True if bundle should be removed in received SDP. |
974 bool remove_sdes_ = | 1008 bool remove_sdes_ = |
975 false; // True if a=crypto should be removed in received SDP. | 1009 false; // True if a=crypto should be removed in received SDP. |
| 1010 // |remove_cvo_| is true if extension urn:3gpp:video-orientation should be |
| 1011 // removed in the received SDP. |
| 1012 bool remove_cvo_ = false; |
976 | 1013 |
977 rtc::scoped_refptr<DataChannelInterface> data_channel_; | 1014 rtc::scoped_refptr<DataChannelInterface> data_channel_; |
978 rtc::scoped_ptr<MockDataChannelObserver> data_observer_; | 1015 rtc::scoped_ptr<MockDataChannelObserver> data_observer_; |
979 }; | 1016 }; |
980 | 1017 |
981 class P2PTestConductor : public testing::Test { | 1018 class P2PTestConductor : public testing::Test { |
982 public: | 1019 public: |
983 P2PTestConductor() | 1020 P2PTestConductor() |
984 : pss_(new rtc::PhysicalSocketServer), | 1021 : pss_(new rtc::PhysicalSocketServer), |
985 ss_(new rtc::VirtualSocketServer(pss_.get())), | 1022 ss_(new rtc::VirtualSocketServer(pss_.get())), |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 pc2_audio_received + kEndAudioFrameCount), | 1077 pc2_audio_received + kEndAudioFrameCount), |
1041 kMaxWaitForFramesMs); | 1078 kMaxWaitForFramesMs); |
1042 | 1079 |
1043 // During this time, we shouldn't have received any additional video frames | 1080 // During this time, we shouldn't have received any additional video frames |
1044 // for the rejected video tracks. | 1081 // for the rejected video tracks. |
1045 EXPECT_EQ(pc1_video_received, initiating_client_->video_frames_received()); | 1082 EXPECT_EQ(pc1_video_received, initiating_client_->video_frames_received()); |
1046 EXPECT_EQ(pc2_video_received, receiving_client_->video_frames_received()); | 1083 EXPECT_EQ(pc2_video_received, receiving_client_->video_frames_received()); |
1047 } | 1084 } |
1048 | 1085 |
1049 void VerifyRenderedSize(int width, int height) { | 1086 void VerifyRenderedSize(int width, int height) { |
| 1087 VerifyRenderedSize(width, height, webrtc::kVideoRotation_0); |
| 1088 } |
| 1089 |
| 1090 void VerifyRenderedSize(int width, |
| 1091 int height, |
| 1092 webrtc::VideoRotation rotation) { |
1050 EXPECT_EQ(width, receiving_client()->rendered_width()); | 1093 EXPECT_EQ(width, receiving_client()->rendered_width()); |
1051 EXPECT_EQ(height, receiving_client()->rendered_height()); | 1094 EXPECT_EQ(height, receiving_client()->rendered_height()); |
| 1095 EXPECT_EQ(rotation, receiving_client()->rendered_rotation()); |
1052 EXPECT_EQ(width, initializing_client()->rendered_width()); | 1096 EXPECT_EQ(width, initializing_client()->rendered_width()); |
1053 EXPECT_EQ(height, initializing_client()->rendered_height()); | 1097 EXPECT_EQ(height, initializing_client()->rendered_height()); |
| 1098 EXPECT_EQ(rotation, initializing_client()->rendered_rotation()); |
| 1099 |
| 1100 // Verify size of the local preview. |
| 1101 EXPECT_EQ(width, initializing_client()->local_rendered_width()); |
| 1102 EXPECT_EQ(height, initializing_client()->local_rendered_height()); |
1054 } | 1103 } |
1055 | 1104 |
1056 void VerifySessionDescriptions() { | 1105 void VerifySessionDescriptions() { |
1057 initiating_client_->VerifyRejectedMediaInSessionDescription(); | 1106 initiating_client_->VerifyRejectedMediaInSessionDescription(); |
1058 receiving_client_->VerifyRejectedMediaInSessionDescription(); | 1107 receiving_client_->VerifyRejectedMediaInSessionDescription(); |
1059 initiating_client_->VerifyLocalIceUfragAndPassword(); | 1108 initiating_client_->VerifyLocalIceUfragAndPassword(); |
1060 receiving_client_->VerifyLocalIceUfragAndPassword(); | 1109 receiving_client_->VerifyLocalIceUfragAndPassword(); |
1061 } | 1110 } |
1062 | 1111 |
1063 ~P2PTestConductor() { | 1112 ~P2PTestConductor() { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 SetSignalingReceivers(); | 1161 SetSignalingReceivers(); |
1113 return true; | 1162 return true; |
1114 } | 1163 } |
1115 | 1164 |
1116 void SetVideoConstraints(const webrtc::FakeConstraints& init_constraints, | 1165 void SetVideoConstraints(const webrtc::FakeConstraints& init_constraints, |
1117 const webrtc::FakeConstraints& recv_constraints) { | 1166 const webrtc::FakeConstraints& recv_constraints) { |
1118 initiating_client_->SetVideoConstraints(init_constraints); | 1167 initiating_client_->SetVideoConstraints(init_constraints); |
1119 receiving_client_->SetVideoConstraints(recv_constraints); | 1168 receiving_client_->SetVideoConstraints(recv_constraints); |
1120 } | 1169 } |
1121 | 1170 |
| 1171 void SetCaptureRotation(webrtc::VideoRotation rotation) { |
| 1172 initiating_client_->SetCaptureRotation(rotation); |
| 1173 receiving_client_->SetCaptureRotation(rotation); |
| 1174 } |
| 1175 |
1122 void EnableVideoDecoderFactory() { | 1176 void EnableVideoDecoderFactory() { |
1123 initiating_client_->EnableVideoDecoderFactory(); | 1177 initiating_client_->EnableVideoDecoderFactory(); |
1124 receiving_client_->EnableVideoDecoderFactory(); | 1178 receiving_client_->EnableVideoDecoderFactory(); |
1125 } | 1179 } |
1126 | 1180 |
1127 // This test sets up a call between two parties. Both parties send static | 1181 // This test sets up a call between two parties. Both parties send static |
1128 // frames to each other. Once the test is finished the number of sent frames | 1182 // frames to each other. Once the test is finished the number of sent frames |
1129 // is compared to the number of received frames. | 1183 // is compared to the number of received frames. |
1130 void LocalP2PTest() { | 1184 void LocalP2PTest() { |
1131 if (initiating_client_->NumberOfLocalMediaStreams() == 0) { | 1185 if (initiating_client_->NumberOfLocalMediaStreams() == 0) { |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1382 rtc::scoped_ptr<PeerConnectionTestClient> original_peer( | 1436 rtc::scoped_ptr<PeerConnectionTestClient> original_peer( |
1383 set_receiving_client(CreateDtlsClientWithAlternateKey())); | 1437 set_receiving_client(CreateDtlsClientWithAlternateKey())); |
1384 original_peer->pc()->Close(); | 1438 original_peer->pc()->Close(); |
1385 | 1439 |
1386 SetSignalingReceivers(); | 1440 SetSignalingReceivers(); |
1387 initializing_client()->IceRestart(); | 1441 initializing_client()->IceRestart(); |
1388 LocalP2PTest(); | 1442 LocalP2PTest(); |
1389 VerifyRenderedSize(640, 480); | 1443 VerifyRenderedSize(640, 480); |
1390 } | 1444 } |
1391 | 1445 |
| 1446 TEST_F(P2PTestConductor, LocalP2PTestCVO) { |
| 1447 ASSERT_TRUE(CreateTestClients()); |
| 1448 SetCaptureRotation(webrtc::kVideoRotation_90); |
| 1449 LocalP2PTest(); |
| 1450 VerifyRenderedSize(640, 480, webrtc::kVideoRotation_90); |
| 1451 } |
| 1452 |
| 1453 TEST_F(P2PTestConductor, LocalP2PTestReceiverDoesntSupportCVO) { |
| 1454 ASSERT_TRUE(CreateTestClients()); |
| 1455 SetCaptureRotation(webrtc::kVideoRotation_90); |
| 1456 receiving_client()->RemoveCvoFromReceivedSdp(true); |
| 1457 LocalP2PTest(); |
| 1458 VerifyRenderedSize(480, 640, webrtc::kVideoRotation_0); |
| 1459 } |
| 1460 |
1392 // This test sets up a call between two endpoints that are configured to use | 1461 // This test sets up a call between two endpoints that are configured to use |
1393 // DTLS key agreement. The offerer don't support SDES. As a result, DTLS is | 1462 // DTLS key agreement. The offerer don't support SDES. As a result, DTLS is |
1394 // negotiated and used for transport. | 1463 // negotiated and used for transport. |
1395 TEST_F(P2PTestConductor, LocalP2PTestOfferDtlsButNotSdes) { | 1464 TEST_F(P2PTestConductor, LocalP2PTestOfferDtlsButNotSdes) { |
1396 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 1465 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
1397 FakeConstraints setup_constraints; | 1466 FakeConstraints setup_constraints; |
1398 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, | 1467 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, |
1399 true); | 1468 true); |
1400 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); | 1469 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints)); |
1401 receiving_client()->RemoveSdesCryptoFromReceivedSdp(true); | 1470 receiving_client()->RemoveSdesCryptoFromReceivedSdp(true); |
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2094 server.urls.push_back("turn:hostname2"); | 2163 server.urls.push_back("turn:hostname2"); |
2095 servers.push_back(server); | 2164 servers.push_back(server); |
2096 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_)); | 2165 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_)); |
2097 EXPECT_EQ(2U, turn_servers_.size()); | 2166 EXPECT_EQ(2U, turn_servers_.size()); |
2098 EXPECT_NE(turn_servers_[0].priority, turn_servers_[1].priority); | 2167 EXPECT_NE(turn_servers_[0].priority, turn_servers_[1].priority); |
2099 } | 2168 } |
2100 | 2169 |
2101 #endif // if !defined(THREAD_SANITIZER) | 2170 #endif // if !defined(THREAD_SANITIZER) |
2102 | 2171 |
2103 } // namespace | 2172 } // namespace |
OLD | NEW |