OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 #include <algorithm> // max | 10 #include <algorithm> // max |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
120 void PerformTest() override { | 120 void PerformTest() override { |
121 EXPECT_EQ(kEventSignaled, Wait()) | 121 EXPECT_EQ(kEventSignaled, Wait()) |
122 << "Timed out while waiting for RTCP with CNAME."; | 122 << "Timed out while waiting for RTCP with CNAME."; |
123 } | 123 } |
124 } test; | 124 } test; |
125 | 125 |
126 RunBaseTest(&test, FakeNetworkPipe::Config()); | 126 RunBaseTest(&test, FakeNetworkPipe::Config()); |
127 } | 127 } |
128 | 128 |
129 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) { | 129 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) { |
130 static const uint8_t kAbsSendTimeExtensionId = 13; | |
131 class AbsoluteSendTimeObserver : public test::SendTest { | 130 class AbsoluteSendTimeObserver : public test::SendTest { |
132 public: | 131 public: |
133 AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) { | 132 AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) { |
134 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( | 133 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( |
135 kRtpExtensionAbsoluteSendTime, kAbsSendTimeExtensionId)); | 134 kRtpExtensionAbsoluteSendTime, test::kAbsSendTimeExtensionId)); |
136 } | 135 } |
137 | 136 |
138 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 137 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
139 RTPHeader header; | 138 RTPHeader header; |
140 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 139 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
141 | 140 |
142 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); | 141 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); |
143 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); | 142 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
144 EXPECT_EQ(header.extension.transmissionTimeOffset, 0); | 143 EXPECT_EQ(header.extension.transmissionTimeOffset, 0); |
145 EXPECT_GT(header.extension.absoluteSendTime, 0u); | 144 EXPECT_GT(header.extension.absoluteSendTime, 0u); |
146 observation_complete_->Set(); | 145 observation_complete_->Set(); |
147 | 146 |
148 return SEND_PACKET; | 147 return SEND_PACKET; |
149 } | 148 } |
150 | 149 |
151 void ModifyConfigs(VideoSendStream::Config* send_config, | 150 void ModifyConfigs(VideoSendStream::Config* send_config, |
152 std::vector<VideoReceiveStream::Config>* receive_configs, | 151 std::vector<VideoReceiveStream::Config>* receive_configs, |
153 VideoEncoderConfig* encoder_config) override { | 152 VideoEncoderConfig* encoder_config) override { |
154 send_config->rtp.extensions.clear(); | 153 send_config->rtp.extensions.clear(); |
155 send_config->rtp.extensions.push_back( | 154 send_config->rtp.extensions.push_back(RtpExtension( |
156 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeExtensionId)); | 155 RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId)); |
157 } | 156 } |
158 | 157 |
159 void PerformTest() override { | 158 void PerformTest() override { |
160 EXPECT_EQ(kEventSignaled, Wait()) | 159 EXPECT_EQ(kEventSignaled, Wait()) |
161 << "Timed out while waiting for single RTP packet."; | 160 << "Timed out while waiting for single RTP packet."; |
162 } | 161 } |
163 } test; | 162 } test; |
164 | 163 |
165 RunBaseTest(&test, FakeNetworkPipe::Config()); | 164 RunBaseTest(&test, FakeNetworkPipe::Config()); |
166 } | 165 } |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
303 return true; | 302 return true; |
304 } | 303 } |
305 | 304 |
306 RtcpStatistics stats_; | 305 RtcpStatistics stats_; |
307 }; | 306 }; |
308 | 307 |
309 rtc::scoped_ptr<LossyStatistician> lossy_stats_; | 308 rtc::scoped_ptr<LossyStatistician> lossy_stats_; |
310 StatisticianMap stats_map_; | 309 StatisticianMap stats_map_; |
311 }; | 310 }; |
312 | 311 |
313 TEST_F(VideoSendStreamTest, SupportsFec) { | 312 class FecObserver : public test::SendTest { |
314 class FecObserver : public test::SendTest { | 313 public: |
315 public: | 314 explicit FecObserver(bool header_extensions_enabled) |
316 FecObserver() | 315 : SendTest(VideoSendStreamTest::kDefaultTimeoutMs), |
317 : SendTest(kDefaultTimeoutMs), | 316 send_count_(0), |
318 send_count_(0), | 317 received_media_(false), |
319 received_media_(false), | 318 received_fec_(false), |
320 received_fec_(false) { | 319 header_extensions_enabled_(header_extensions_enabled) {} |
320 | |
321 private: | |
322 Action OnSendRtp(const uint8_t* packet, size_t length) override { | |
323 RTPHeader header; | |
324 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | |
325 | |
326 // Send lossy receive reports to trigger FEC enabling. | |
327 if (send_count_++ % 2 != 0) { | |
328 // Receive statistics reporting having lost 50% of the packets. | |
329 FakeReceiveStatistics lossy_receive_stats( | |
330 VideoSendStreamTest::kSendSsrcs[0], header.sequenceNumber, | |
331 send_count_ / 2, 127); | |
332 RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), | |
333 &lossy_receive_stats, nullptr, | |
334 transport_adapter_.get()); | |
335 | |
336 rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize); | |
337 rtcp_sender.SetRemoteSSRC(VideoSendStreamTest::kSendSsrcs[0]); | |
338 | |
339 RTCPSender::FeedbackState feedback_state; | |
340 | |
341 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); | |
321 } | 342 } |
322 | 343 |
323 private: | 344 int encapsulated_payload_type = -1; |
324 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 345 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) { |
325 RTPHeader header; | 346 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]); |
326 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 347 if (encapsulated_payload_type != |
327 | 348 VideoSendStreamTest::kFakeSendPayloadType) |
328 // Send lossy receive reports to trigger FEC enabling. | 349 EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType, |
329 if (send_count_++ % 2 != 0) { | 350 encapsulated_payload_type); |
330 // Receive statistics reporting having lost 50% of the packets. | 351 } else { |
331 FakeReceiveStatistics lossy_receive_stats( | 352 EXPECT_EQ(VideoSendStreamTest::kFakeSendPayloadType, header.payloadType); |
332 kSendSsrcs[0], header.sequenceNumber, send_count_ / 2, 127); | |
333 RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), | |
334 &lossy_receive_stats, nullptr, | |
335 transport_adapter_.get()); | |
336 | |
337 rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize); | |
338 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]); | |
339 | |
340 RTCPSender::FeedbackState feedback_state; | |
341 | |
342 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); | |
343 } | |
344 | |
345 int encapsulated_payload_type = -1; | |
346 if (header.payloadType == kRedPayloadType) { | |
347 encapsulated_payload_type = | |
348 static_cast<int>(packet[header.headerLength]); | |
349 if (encapsulated_payload_type != kFakeSendPayloadType) | |
350 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); | |
351 } else { | |
352 EXPECT_EQ(kFakeSendPayloadType, header.payloadType); | |
353 } | |
354 | |
355 if (encapsulated_payload_type != -1) { | |
356 if (encapsulated_payload_type == kUlpfecPayloadType) { | |
357 received_fec_ = true; | |
358 } else { | |
359 received_media_ = true; | |
360 } | |
361 } | |
362 | |
363 if (received_media_ && received_fec_) | |
364 observation_complete_->Set(); | |
365 | |
366 return SEND_PACKET; | |
367 } | 353 } |
368 | 354 |
369 void ModifyConfigs(VideoSendStream::Config* send_config, | 355 if (header_extensions_enabled_) { |
370 std::vector<VideoReceiveStream::Config>* receive_configs, | 356 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
371 VideoEncoderConfig* encoder_config) override { | 357 EXPECT_GE(header.extension.absoluteSendTime, |
pbos-webrtc
2015/12/07 15:43:59
Might wrap.
| |
372 transport_adapter_.reset( | 358 prev_header_.extension.absoluteSendTime); |
373 new internal::TransportAdapter(send_config->send_transport)); | 359 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
374 transport_adapter_->Enable(); | 360 EXPECT_EQ(prev_header_.extension.transportSequenceNumber + 1, |
pbos-webrtc
2015/12/07 15:43:59
Might wrap
| |
375 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 361 header.extension.transportSequenceNumber); |
376 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | |
377 } | 362 } |
378 | 363 |
379 void PerformTest() override { | 364 if (encapsulated_payload_type != -1) { |
380 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; | 365 if (encapsulated_payload_type == |
366 VideoSendStreamTest::kUlpfecPayloadType) { | |
367 received_fec_ = true; | |
368 } else { | |
369 received_media_ = true; | |
370 } | |
381 } | 371 } |
382 | 372 |
383 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_; | 373 if (received_media_ && received_fec_ && send_count_ > 100) |
384 int send_count_; | 374 observation_complete_->Set(); |
385 bool received_media_; | 375 |
386 bool received_fec_; | 376 prev_header_ = header; |
387 } test; | 377 |
378 return SEND_PACKET; | |
379 } | |
380 | |
381 void ModifyConfigs(VideoSendStream::Config* send_config, | |
382 std::vector<VideoReceiveStream::Config>* receive_configs, | |
383 VideoEncoderConfig* encoder_config) override { | |
384 transport_adapter_.reset( | |
385 new internal::TransportAdapter(send_config->send_transport)); | |
386 transport_adapter_->Enable(); | |
387 send_config->rtp.fec.red_payload_type = | |
388 VideoSendStreamTest::kRedPayloadType; | |
389 send_config->rtp.fec.ulpfec_payload_type = | |
390 VideoSendStreamTest::kUlpfecPayloadType; | |
391 if (header_extensions_enabled_) { | |
392 send_config->rtp.extensions.push_back(RtpExtension( | |
393 RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId)); | |
394 send_config->rtp.extensions.push_back( | |
395 RtpExtension(RtpExtension::kTransportSequenceNumber, | |
396 test::kTransportSequenceNumberExtensionId)); | |
397 } | |
398 } | |
399 | |
400 void PerformTest() override { | |
401 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; | |
402 } | |
403 | |
404 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_; | |
405 int send_count_; | |
406 bool received_media_; | |
407 bool received_fec_; | |
408 bool header_extensions_enabled_; | |
409 RTPHeader prev_header_; | |
410 }; | |
411 | |
412 TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) { | |
413 FecObserver test(true); | |
388 | 414 |
389 RunBaseTest(&test, FakeNetworkPipe::Config()); | 415 RunBaseTest(&test, FakeNetworkPipe::Config()); |
390 } | 416 } |
417 | |
418 TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) { | |
419 FecObserver test(false); | |
420 | |
421 RunBaseTest(&test, FakeNetworkPipe::Config()); | |
422 } | |
391 | 423 |
392 void VideoSendStreamTest::TestNackRetransmission( | 424 void VideoSendStreamTest::TestNackRetransmission( |
393 uint32_t retransmit_ssrc, | 425 uint32_t retransmit_ssrc, |
394 uint8_t retransmit_payload_type) { | 426 uint8_t retransmit_payload_type) { |
395 class NackObserver : public test::SendTest { | 427 class NackObserver : public test::SendTest { |
396 public: | 428 public: |
397 explicit NackObserver(uint32_t retransmit_ssrc, | 429 explicit NackObserver(uint32_t retransmit_ssrc, |
398 uint8_t retransmit_payload_type) | 430 uint8_t retransmit_payload_type) |
399 : SendTest(kDefaultTimeoutMs), | 431 : SendTest(kDefaultTimeoutMs), |
400 send_count_(0), | 432 send_count_(0), |
(...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2169 EXPECT_GT(vp9_header.num_ref_pics, 0u); | 2201 EXPECT_GT(vp9_header.num_ref_pics, 0u); |
2170 observation_complete_->Set(); | 2202 observation_complete_->Set(); |
2171 } | 2203 } |
2172 } | 2204 } |
2173 } test; | 2205 } test; |
2174 | 2206 |
2175 RunBaseTest(&test, FakeNetworkPipe::Config()); | 2207 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2176 } | 2208 } |
2177 | 2209 |
2178 } // namespace webrtc | 2210 } // namespace webrtc |
OLD | NEW |