OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2004 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 if (cricket::CodecNamesEq(codec.name.c_str(), "rtx") && | 76 if (cricket::CodecNamesEq(codec.name.c_str(), "rtx") && |
77 codec.GetParam(cricket::kCodecParamAssociatedPayloadType, | 77 codec.GetParam(cricket::kCodecParamAssociatedPayloadType, |
78 &associated_payload_type) && | 78 &associated_payload_type) && |
79 associated_payload_type == payload_type) { | 79 associated_payload_type == payload_type) { |
80 return true; | 80 return true; |
81 } | 81 } |
82 } | 82 } |
83 return false; | 83 return false; |
84 } | 84 } |
85 | 85 |
| 86 // TODO(nisse): Duplicated in call.cc. |
| 87 const int* FindKeyByValue(const std::map<int, int>& m, int v) { |
| 88 for (const auto& kv : m) { |
| 89 if (kv.second == v) |
| 90 return &kv.first; |
| 91 } |
| 92 return nullptr; |
| 93 } |
| 94 |
| 95 bool HasRtxReceiveAssociation( |
| 96 const webrtc::VideoReceiveStream::Config& config, |
| 97 int payload_type) { |
| 98 return FindKeyByValue(config.rtp.rtx_associated_payload_types, |
| 99 payload_type) != nullptr; |
| 100 } |
| 101 |
| 102 // Check that there's an Rtx payload type for each decoder. |
| 103 bool VerifyRtxReceiveAssociations( |
| 104 const webrtc::VideoReceiveStream::Config& config) { |
| 105 for (const auto& decoder : config.decoders) { |
| 106 if (!HasRtxReceiveAssociation(config, decoder.payload_type)) |
| 107 return false; |
| 108 } |
| 109 return true; |
| 110 } |
| 111 |
86 rtc::scoped_refptr<webrtc::VideoFrameBuffer> CreateBlackFrameBuffer( | 112 rtc::scoped_refptr<webrtc::VideoFrameBuffer> CreateBlackFrameBuffer( |
87 int width, | 113 int width, |
88 int height) { | 114 int height) { |
89 rtc::scoped_refptr<webrtc::I420Buffer> buffer = | 115 rtc::scoped_refptr<webrtc::I420Buffer> buffer = |
90 webrtc::I420Buffer::Create(width, height); | 116 webrtc::I420Buffer::Create(width, height); |
91 webrtc::I420Buffer::SetBlack(buffer); | 117 webrtc::I420Buffer::SetBlack(buffer); |
92 return buffer; | 118 return buffer; |
93 } | 119 } |
94 | 120 |
95 void VerifySendStreamHasRtxTypes(const webrtc::VideoSendStream::Config& config, | 121 void VerifySendStreamHasRtxTypes(const webrtc::VideoSendStream::Config& config, |
96 const std::map<int, int>& rtx_types) { | 122 const std::map<int, int>& rtx_types) { |
97 std::map<int, int>::const_iterator it; | 123 std::map<int, int>::const_iterator it; |
98 it = rtx_types.find(config.encoder_settings.payload_type); | 124 it = rtx_types.find(config.encoder_settings.payload_type); |
99 EXPECT_TRUE(it != rtx_types.end() && | 125 EXPECT_TRUE(it != rtx_types.end() && |
100 it->second == config.rtp.rtx.payload_type); | 126 it->second == config.rtp.rtx.payload_type); |
101 | 127 |
102 if (config.rtp.ulpfec.red_rtx_payload_type != -1) { | 128 if (config.rtp.ulpfec.red_rtx_payload_type != -1) { |
103 it = rtx_types.find(config.rtp.ulpfec.red_payload_type); | 129 it = rtx_types.find(config.rtp.ulpfec.red_payload_type); |
104 EXPECT_TRUE(it != rtx_types.end() && | 130 EXPECT_TRUE(it != rtx_types.end() && |
105 it->second == config.rtp.ulpfec.red_rtx_payload_type); | 131 it->second == config.rtp.ulpfec.red_rtx_payload_type); |
106 } | 132 } |
107 } | 133 } |
108 | 134 |
109 cricket::MediaConfig GetMediaConfig() { | 135 cricket::MediaConfig GetMediaConfig() { |
110 cricket::MediaConfig media_config; | 136 cricket::MediaConfig media_config; |
111 media_config.video.enable_cpu_overuse_detection = false; | 137 media_config.video.enable_cpu_overuse_detection = false; |
112 return media_config; | 138 return media_config; |
113 } | 139 } |
114 | 140 |
115 // TODO(nisse): Duplicated in call.cc. | |
116 const int* FindKeyByValue(const std::map<int, int>& m, int v) { | |
117 for (const auto& kv : m) { | |
118 if (kv.second == v) | |
119 return &kv.first; | |
120 } | |
121 return nullptr; | |
122 } | |
123 | |
124 } // namespace | 141 } // namespace |
125 | 142 |
126 namespace cricket { | 143 namespace cricket { |
127 class WebRtcVideoEngineTest : public ::testing::Test { | 144 class WebRtcVideoEngineTest : public ::testing::Test { |
128 public: | 145 public: |
129 WebRtcVideoEngineTest() : WebRtcVideoEngineTest("") {} | 146 WebRtcVideoEngineTest() : WebRtcVideoEngineTest("") {} |
130 explicit WebRtcVideoEngineTest(const char* field_trials) | 147 explicit WebRtcVideoEngineTest(const char* field_trials) |
131 : override_field_trials_(field_trials), | 148 : override_field_trials_(field_trials), |
132 call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))), | 149 call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))), |
133 engine_() { | 150 engine_() { |
(...skipping 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1309 | 1326 |
1310 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size()); | 1327 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size()); |
1311 for (size_t i = 0; i < rtx_ssrcs.size(); ++i) | 1328 for (size_t i = 0; i < rtx_ssrcs.size(); ++i) |
1312 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]); | 1329 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]); |
1313 | 1330 |
1314 // Receiver side. | 1331 // Receiver side. |
1315 FakeVideoReceiveStream* recv_stream = AddRecvStream( | 1332 FakeVideoReceiveStream* recv_stream = AddRecvStream( |
1316 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)); | 1333 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)); |
1317 EXPECT_FALSE( | 1334 EXPECT_FALSE( |
1318 recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); | 1335 recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); |
1319 EXPECT_EQ(recv_stream->GetConfig().decoders.size(), | 1336 EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig())) |
1320 recv_stream->GetConfig().rtp.rtx_associated_payload_types.size()) | |
1321 << "RTX should be mapped for all decoders/payload types."; | 1337 << "RTX should be mapped for all decoders/payload types."; |
| 1338 EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(), |
| 1339 GetEngineCodec("red").id)) |
| 1340 << "RTX should be mapped for the RED payload type"; |
| 1341 |
1322 EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); | 1342 EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); |
1323 } | 1343 } |
1324 | 1344 |
1325 TEST_F(WebRtcVideoChannelTest, RecvStreamWithRtx) { | 1345 TEST_F(WebRtcVideoChannelTest, RecvStreamWithRtx) { |
1326 // Setup one channel with an associated RTX stream. | 1346 // Setup one channel with an associated RTX stream. |
1327 cricket::StreamParams params = | 1347 cricket::StreamParams params = |
1328 cricket::StreamParams::CreateLegacy(kSsrcs1[0]); | 1348 cricket::StreamParams::CreateLegacy(kSsrcs1[0]); |
1329 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]); | 1349 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]); |
1330 FakeVideoReceiveStream* recv_stream = AddRecvStream(params); | 1350 FakeVideoReceiveStream* recv_stream = AddRecvStream(params); |
1331 EXPECT_EQ(kRtxSsrcs1[0], recv_stream->GetConfig().rtp.rtx_ssrc); | 1351 EXPECT_EQ(kRtxSsrcs1[0], recv_stream->GetConfig().rtp.rtx_ssrc); |
| 1352 |
| 1353 EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig())) |
| 1354 << "RTX should be mapped for all decoders/payload types."; |
| 1355 EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(), |
| 1356 GetEngineCodec("red").id)) |
| 1357 << "RTX should be mapped for the RED payload type"; |
1332 } | 1358 } |
1333 | 1359 |
1334 TEST_F(WebRtcVideoChannelTest, RecvStreamNoRtx) { | 1360 TEST_F(WebRtcVideoChannelTest, RecvStreamNoRtx) { |
1335 // Setup one channel without an associated RTX stream. | 1361 // Setup one channel without an associated RTX stream. |
1336 cricket::StreamParams params = | 1362 cricket::StreamParams params = |
1337 cricket::StreamParams::CreateLegacy(kSsrcs1[0]); | 1363 cricket::StreamParams::CreateLegacy(kSsrcs1[0]); |
1338 FakeVideoReceiveStream* recv_stream = AddRecvStream(params); | 1364 FakeVideoReceiveStream* recv_stream = AddRecvStream(params); |
1339 ASSERT_EQ(0U, recv_stream->GetConfig().rtp.rtx_ssrc); | 1365 ASSERT_EQ(0U, recv_stream->GetConfig().rtp.rtx_ssrc); |
1340 } | 1366 } |
1341 | 1367 |
(...skipping 2447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3789 EXPECT_EQ(0u, recv_stream->GetConfig().rtp.rtx_ssrc) | 3815 EXPECT_EQ(0u, recv_stream->GetConfig().rtp.rtx_ssrc) |
3790 << "Default receive stream should not have configured RTX"; | 3816 << "Default receive stream should not have configured RTX"; |
3791 | 3817 |
3792 EXPECT_TRUE(channel_->AddRecvStream( | 3818 EXPECT_TRUE(channel_->AddRecvStream( |
3793 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs))); | 3819 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs))); |
3794 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) | 3820 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) |
3795 << "AddRecvStream should have reconfigured, not added a new receiver."; | 3821 << "AddRecvStream should have reconfigured, not added a new receiver."; |
3796 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; | 3822 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; |
3797 EXPECT_FALSE( | 3823 EXPECT_FALSE( |
3798 recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); | 3824 recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); |
3799 EXPECT_EQ(recv_stream->GetConfig().decoders.size(), | 3825 EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig())) |
3800 recv_stream->GetConfig().rtp.rtx_associated_payload_types.size()) | |
3801 << "RTX should be mapped for all decoders/payload types."; | 3826 << "RTX should be mapped for all decoders/payload types."; |
| 3827 EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(), |
| 3828 GetEngineCodec("red").id)) |
| 3829 << "RTX should be mapped also for the RED payload type"; |
3802 EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); | 3830 EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); |
3803 } | 3831 } |
3804 | 3832 |
3805 TEST_F(WebRtcVideoChannelTest, RejectsAddingStreamsWithMissingSsrcsForRtx) { | 3833 TEST_F(WebRtcVideoChannelTest, RejectsAddingStreamsWithMissingSsrcsForRtx) { |
3806 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_)); | 3834 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_)); |
3807 | 3835 |
3808 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); | 3836 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); |
3809 const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1); | 3837 const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1); |
3810 | 3838 |
3811 StreamParams sp = | 3839 StreamParams sp = |
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4670 | 4698 |
4671 TEST_F(WebRtcVideoChannelSimulcastTest, | 4699 TEST_F(WebRtcVideoChannelSimulcastTest, |
4672 NoSimulcastScreenshareWithoutConference) { | 4700 NoSimulcastScreenshareWithoutConference) { |
4673 webrtc::test::ScopedFieldTrials override_field_trials_( | 4701 webrtc::test::ScopedFieldTrials override_field_trials_( |
4674 "WebRTC-SimulcastScreenshare/Enabled/"); | 4702 "WebRTC-SimulcastScreenshare/Enabled/"); |
4675 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 1, true, | 4703 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 1, true, |
4676 false); | 4704 false); |
4677 } | 4705 } |
4678 | 4706 |
4679 } // namespace cricket | 4707 } // namespace cricket |
OLD | NEW |