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> | 10 #include <algorithm> |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 return false; | 74 return false; |
75 } | 75 } |
76 }; | 76 }; |
77 | 77 |
78 void DecodesRetransmittedFrame(bool use_rtx, bool use_red); | 78 void DecodesRetransmittedFrame(bool use_rtx, bool use_red); |
79 void ReceivesPliAndRecovers(int rtp_history_ms); | 79 void ReceivesPliAndRecovers(int rtp_history_ms); |
80 void RespectsRtcpMode(RtcpMode rtcp_mode); | 80 void RespectsRtcpMode(RtcpMode rtcp_mode); |
81 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); | 81 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); |
82 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); | 82 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); |
83 void TestRtpStatePreservation(bool use_rtx); | 83 void TestRtpStatePreservation(bool use_rtx); |
84 void TestReceivedFecPacketsNotNacked(const FakeNetworkPipe::Config& config); | |
85 void VerifyHistogramStats(bool use_rtx, bool use_red); | 84 void VerifyHistogramStats(bool use_rtx, bool use_red); |
86 }; | 85 }; |
87 | 86 |
88 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { | 87 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { |
89 CreateCalls(Call::Config(), Call::Config()); | 88 CreateCalls(Call::Config(), Call::Config()); |
90 | 89 |
91 test::NullTransport transport; | 90 test::NullTransport transport; |
92 CreateSendConfig(1, &transport); | 91 CreateSendConfig(1, &transport); |
93 CreateMatchingReceiveConfigs(&transport); | 92 CreateMatchingReceiveConfigs(&transport); |
94 | 93 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 void FrameCallback(VideoFrame* frame) override { | 148 void FrameCallback(VideoFrame* frame) override { |
150 SleepMs(kDelayRenderCallbackMs); | 149 SleepMs(kDelayRenderCallbackMs); |
151 event_->Set(); | 150 event_->Set(); |
152 } | 151 } |
153 | 152 |
154 rtc::scoped_ptr<EventWrapper> event_; | 153 rtc::scoped_ptr<EventWrapper> event_; |
155 }; | 154 }; |
156 | 155 |
157 CreateCalls(Call::Config(), Call::Config()); | 156 CreateCalls(Call::Config(), Call::Config()); |
158 | 157 |
159 test::DirectTransport sender_transport, receiver_transport; | 158 test::DirectTransport sender_transport(sender_call_.get()); |
| 159 test::DirectTransport receiver_transport(receiver_call_.get()); |
160 sender_transport.SetReceiver(receiver_call_->Receiver()); | 160 sender_transport.SetReceiver(receiver_call_->Receiver()); |
161 receiver_transport.SetReceiver(sender_call_->Receiver()); | 161 receiver_transport.SetReceiver(sender_call_->Receiver()); |
162 | 162 |
163 CreateSendConfig(1, &sender_transport); | 163 CreateSendConfig(1, &sender_transport); |
164 CreateMatchingReceiveConfigs(&receiver_transport); | 164 CreateMatchingReceiveConfigs(&receiver_transport); |
165 | 165 |
166 TestFrameCallback pre_render_callback; | 166 TestFrameCallback pre_render_callback; |
167 receive_configs_[0].pre_render_callback = &pre_render_callback; | 167 receive_configs_[0].pre_render_callback = &pre_render_callback; |
168 receive_configs_[0].renderer = &renderer; | 168 receive_configs_[0].renderer = &renderer; |
169 | 169 |
(...skipping 29 matching lines...) Expand all Loading... |
199 } | 199 } |
200 bool IsTextureSupported() const override { return false; } | 200 bool IsTextureSupported() const override { return false; } |
201 | 201 |
202 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } | 202 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } |
203 | 203 |
204 rtc::scoped_ptr<EventWrapper> event_; | 204 rtc::scoped_ptr<EventWrapper> event_; |
205 } renderer; | 205 } renderer; |
206 | 206 |
207 CreateCalls(Call::Config(), Call::Config()); | 207 CreateCalls(Call::Config(), Call::Config()); |
208 | 208 |
209 test::DirectTransport sender_transport, receiver_transport; | 209 test::DirectTransport sender_transport(sender_call_.get()); |
| 210 test::DirectTransport receiver_transport(receiver_call_.get()); |
210 sender_transport.SetReceiver(receiver_call_->Receiver()); | 211 sender_transport.SetReceiver(receiver_call_->Receiver()); |
211 receiver_transport.SetReceiver(sender_call_->Receiver()); | 212 receiver_transport.SetReceiver(sender_call_->Receiver()); |
212 | 213 |
213 CreateSendConfig(1, &sender_transport); | 214 CreateSendConfig(1, &sender_transport); |
214 CreateMatchingReceiveConfigs(&receiver_transport); | 215 CreateMatchingReceiveConfigs(&receiver_transport); |
215 receive_configs_[0].renderer = &renderer; | 216 receive_configs_[0].renderer = &renderer; |
216 | 217 |
217 CreateStreams(); | 218 CreateStreams(); |
218 Start(); | 219 Start(); |
219 | 220 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 } | 275 } |
275 | 276 |
276 bool IsTextureSupported() const override { return false; } | 277 bool IsTextureSupported() const override { return false; } |
277 | 278 |
278 private: | 279 private: |
279 rtc::scoped_ptr<webrtc::VideoEncoder> encoder_; | 280 rtc::scoped_ptr<webrtc::VideoEncoder> encoder_; |
280 rtc::scoped_ptr<webrtc::VideoDecoder> decoder_; | 281 rtc::scoped_ptr<webrtc::VideoDecoder> decoder_; |
281 int frame_counter_; | 282 int frame_counter_; |
282 } test; | 283 } test; |
283 | 284 |
284 RunBaseTest(&test); | 285 RunBaseTest(&test, FakeNetworkPipe::Config()); |
285 } | 286 } |
286 | 287 |
287 TEST_F(EndToEndTest, SendsAndReceivesH264) { | 288 TEST_F(EndToEndTest, SendsAndReceivesH264) { |
288 class H264Observer : public test::EndToEndTest, public VideoRenderer { | 289 class H264Observer : public test::EndToEndTest, public VideoRenderer { |
289 public: | 290 public: |
290 H264Observer() | 291 H264Observer() |
291 : EndToEndTest(2 * kDefaultTimeoutMs), | 292 : EndToEndTest(2 * kDefaultTimeoutMs), |
292 fake_encoder_(Clock::GetRealTimeClock()), | 293 fake_encoder_(Clock::GetRealTimeClock()), |
293 frame_counter_(0) {} | 294 frame_counter_(0) {} |
294 | 295 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 } | 327 } |
327 | 328 |
328 bool IsTextureSupported() const override { return false; } | 329 bool IsTextureSupported() const override { return false; } |
329 | 330 |
330 private: | 331 private: |
331 test::FakeH264Decoder fake_decoder_; | 332 test::FakeH264Decoder fake_decoder_; |
332 test::FakeH264Encoder fake_encoder_; | 333 test::FakeH264Encoder fake_encoder_; |
333 int frame_counter_; | 334 int frame_counter_; |
334 } test; | 335 } test; |
335 | 336 |
336 RunBaseTest(&test); | 337 RunBaseTest(&test, FakeNetworkPipe::Config()); |
337 } | 338 } |
338 | 339 |
339 TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) { | 340 TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) { |
340 class SyncRtcpObserver : public test::EndToEndTest { | 341 class SyncRtcpObserver : public test::EndToEndTest { |
341 public: | 342 public: |
342 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {} | 343 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {} |
343 | 344 |
344 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 345 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
345 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 346 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
346 EXPECT_TRUE(parser.IsValid()); | 347 EXPECT_TRUE(parser.IsValid()); |
347 uint32_t ssrc = 0; | 348 uint32_t ssrc = 0; |
348 ssrc |= static_cast<uint32_t>(packet[4]) << 24; | 349 ssrc |= static_cast<uint32_t>(packet[4]) << 24; |
349 ssrc |= static_cast<uint32_t>(packet[5]) << 16; | 350 ssrc |= static_cast<uint32_t>(packet[5]) << 16; |
350 ssrc |= static_cast<uint32_t>(packet[6]) << 8; | 351 ssrc |= static_cast<uint32_t>(packet[6]) << 8; |
351 ssrc |= static_cast<uint32_t>(packet[7]) << 0; | 352 ssrc |= static_cast<uint32_t>(packet[7]) << 0; |
352 EXPECT_EQ(kReceiverLocalSsrc, ssrc); | 353 EXPECT_EQ(kReceiverLocalSsrc, ssrc); |
353 observation_complete_->Set(); | 354 observation_complete_->Set(); |
354 | 355 |
355 return SEND_PACKET; | 356 return SEND_PACKET; |
356 } | 357 } |
357 | 358 |
358 void PerformTest() override { | 359 void PerformTest() override { |
359 EXPECT_EQ(kEventSignaled, Wait()) | 360 EXPECT_EQ(kEventSignaled, Wait()) |
360 << "Timed out while waiting for a receiver RTCP packet to be sent."; | 361 << "Timed out while waiting for a receiver RTCP packet to be sent."; |
361 } | 362 } |
362 } test; | 363 } test; |
363 | 364 |
364 RunBaseTest(&test); | 365 RunBaseTest(&test, FakeNetworkPipe::Config()); |
365 } | 366 } |
366 | 367 |
367 TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) { | 368 TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) { |
368 static const int kNumberOfNacksToObserve = 2; | 369 static const int kNumberOfNacksToObserve = 2; |
369 static const int kLossBurstSize = 2; | 370 static const int kLossBurstSize = 2; |
370 static const int kPacketsBetweenLossBursts = 9; | 371 static const int kPacketsBetweenLossBursts = 9; |
371 class NackObserver : public test::EndToEndTest { | 372 class NackObserver : public test::EndToEndTest { |
372 public: | 373 public: |
373 NackObserver() | 374 NackObserver() |
374 : EndToEndTest(kLongTimeoutMs), | 375 : EndToEndTest(kLongTimeoutMs), |
375 rtp_parser_(RtpHeaderParser::Create()), | 376 rtp_parser_(RtpHeaderParser::Create()), |
376 sent_rtp_packets_(0), | 377 sent_rtp_packets_(0), |
377 packets_left_to_drop_(0), | 378 packets_left_to_drop_(0), |
378 nacks_left_(kNumberOfNacksToObserve) {} | 379 nacks_left_(kNumberOfNacksToObserve) {} |
379 | 380 |
380 private: | 381 private: |
381 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 382 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 383 rtc::CritScope lock(&crit_); |
382 RTPHeader header; | 384 RTPHeader header; |
383 EXPECT_TRUE(rtp_parser_->Parse(packet, length, &header)); | 385 EXPECT_TRUE(rtp_parser_->Parse(packet, length, &header)); |
384 | 386 |
385 // Never drop retransmitted packets. | 387 // Never drop retransmitted packets. |
386 if (dropped_packets_.find(header.sequenceNumber) != | 388 if (dropped_packets_.find(header.sequenceNumber) != |
387 dropped_packets_.end()) { | 389 dropped_packets_.end()) { |
388 retransmitted_packets_.insert(header.sequenceNumber); | 390 retransmitted_packets_.insert(header.sequenceNumber); |
389 if (nacks_left_ <= 0 && | 391 if (nacks_left_ <= 0 && |
390 retransmitted_packets_.size() == dropped_packets_.size()) { | 392 retransmitted_packets_.size() == dropped_packets_.size()) { |
391 observation_complete_->Set(); | 393 observation_complete_->Set(); |
(...skipping 15 matching lines...) Expand all Loading... |
407 if (packets_left_to_drop_ > 0 && header.paddingLength == 0) { | 409 if (packets_left_to_drop_ > 0 && header.paddingLength == 0) { |
408 --packets_left_to_drop_; | 410 --packets_left_to_drop_; |
409 dropped_packets_.insert(header.sequenceNumber); | 411 dropped_packets_.insert(header.sequenceNumber); |
410 return DROP_PACKET; | 412 return DROP_PACKET; |
411 } | 413 } |
412 | 414 |
413 return SEND_PACKET; | 415 return SEND_PACKET; |
414 } | 416 } |
415 | 417 |
416 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 418 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
| 419 rtc::CritScope lock(&crit_); |
417 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 420 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
418 EXPECT_TRUE(parser.IsValid()); | 421 EXPECT_TRUE(parser.IsValid()); |
419 | 422 |
420 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); | 423 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); |
421 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { | 424 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { |
422 if (packet_type == RTCPUtility::RTCPPacketTypes::kRtpfbNack) { | 425 if (packet_type == RTCPUtility::RTCPPacketTypes::kRtpfbNack) { |
423 --nacks_left_; | 426 --nacks_left_; |
424 break; | 427 break; |
425 } | 428 } |
426 packet_type = parser.Iterate(); | 429 packet_type = parser.Iterate(); |
427 } | 430 } |
428 return SEND_PACKET; | 431 return SEND_PACKET; |
429 } | 432 } |
430 | 433 |
431 void ModifyConfigs(VideoSendStream::Config* send_config, | 434 void ModifyConfigs(VideoSendStream::Config* send_config, |
432 std::vector<VideoReceiveStream::Config>* receive_configs, | 435 std::vector<VideoReceiveStream::Config>* receive_configs, |
433 VideoEncoderConfig* encoder_config) override { | 436 VideoEncoderConfig* encoder_config) override { |
434 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 437 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
435 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 438 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
436 } | 439 } |
437 | 440 |
438 void PerformTest() override { | 441 void PerformTest() override { |
439 EXPECT_EQ(kEventSignaled, Wait()) | 442 EXPECT_EQ(kEventSignaled, Wait()) |
440 << "Timed out waiting for packets to be NACKed, retransmitted and " | 443 << "Timed out waiting for packets to be NACKed, retransmitted and " |
441 "rendered."; | 444 "rendered."; |
442 } | 445 } |
443 | 446 |
| 447 rtc::CriticalSection crit_; |
444 rtc::scoped_ptr<RtpHeaderParser> rtp_parser_; | 448 rtc::scoped_ptr<RtpHeaderParser> rtp_parser_; |
445 std::set<uint16_t> dropped_packets_; | 449 std::set<uint16_t> dropped_packets_; |
446 std::set<uint16_t> retransmitted_packets_; | 450 std::set<uint16_t> retransmitted_packets_; |
447 uint64_t sent_rtp_packets_; | 451 uint64_t sent_rtp_packets_; |
448 int packets_left_to_drop_; | 452 int packets_left_to_drop_; |
449 int nacks_left_; | 453 int nacks_left_ GUARDED_BY(&crit_); |
450 } test; | 454 } test; |
451 | 455 |
452 RunBaseTest(&test); | 456 RunBaseTest(&test, FakeNetworkPipe::Config()); |
453 } | 457 } |
454 | 458 |
455 TEST_F(EndToEndTest, CanReceiveFec) { | 459 TEST_F(EndToEndTest, CanReceiveFec) { |
456 class FecRenderObserver : public test::EndToEndTest, public VideoRenderer { | 460 class FecRenderObserver : public test::EndToEndTest, public VideoRenderer { |
457 public: | 461 public: |
458 FecRenderObserver() | 462 FecRenderObserver() |
459 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {} | 463 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {} |
460 | 464 |
461 private: | 465 private: |
462 Action OnSendRtp(const uint8_t* packet, size_t length) override | 466 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
463 EXCLUSIVE_LOCKS_REQUIRED(crit_) { | 467 rtc::CritScope lock(&crit_); |
464 RTPHeader header; | 468 RTPHeader header; |
465 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 469 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
466 | 470 |
467 int encapsulated_payload_type = -1; | 471 int encapsulated_payload_type = -1; |
468 if (header.payloadType == kRedPayloadType) { | 472 if (header.payloadType == kRedPayloadType) { |
469 encapsulated_payload_type = | 473 encapsulated_payload_type = |
470 static_cast<int>(packet[header.headerLength]); | 474 static_cast<int>(packet[header.headerLength]); |
471 if (encapsulated_payload_type != kFakeSendPayloadType) | 475 if (encapsulated_payload_type != kFakeSendPayloadType) |
472 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); | 476 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |
473 } else { | 477 } else { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 541 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
538 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 542 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
539 (*receive_configs)[0].renderer = this; | 543 (*receive_configs)[0].renderer = this; |
540 } | 544 } |
541 | 545 |
542 void PerformTest() override { | 546 void PerformTest() override { |
543 EXPECT_EQ(kEventSignaled, Wait()) | 547 EXPECT_EQ(kEventSignaled, Wait()) |
544 << "Timed out waiting for dropped frames frames to be rendered."; | 548 << "Timed out waiting for dropped frames frames to be rendered."; |
545 } | 549 } |
546 | 550 |
| 551 rtc::CriticalSection crit_; |
547 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); | 552 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); |
548 std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_); | 553 std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_); |
549 } test; | 554 } test; |
550 | 555 |
551 RunBaseTest(&test); | 556 RunBaseTest(&test, FakeNetworkPipe::Config()); |
552 } | 557 } |
553 | 558 |
554 // Flacky on all platforms. See webrtc:4328. | 559 // Flacky on all platforms. See webrtc:4328. |
555 TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) { | 560 TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) { |
556 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. | |
557 // Configure some network delay. | |
558 const int kNetworkDelayMs = 50; | |
559 FakeNetworkPipe::Config config; | |
560 config.queue_delay_ms = kNetworkDelayMs; | |
561 TestReceivedFecPacketsNotNacked(config); | |
562 } | |
563 | |
564 void EndToEndTest::TestReceivedFecPacketsNotNacked( | |
565 const FakeNetworkPipe::Config& config) { | |
566 class FecNackObserver : public test::EndToEndTest { | 561 class FecNackObserver : public test::EndToEndTest { |
567 public: | 562 public: |
568 explicit FecNackObserver(const FakeNetworkPipe::Config& config) | 563 explicit FecNackObserver() |
569 : EndToEndTest(kDefaultTimeoutMs, config), | 564 : EndToEndTest(kDefaultTimeoutMs), |
570 state_(kFirstPacket), | 565 state_(kFirstPacket), |
571 fec_sequence_number_(0), | 566 fec_sequence_number_(0), |
572 has_last_sequence_number_(false), | 567 has_last_sequence_number_(false), |
573 last_sequence_number_(0) {} | 568 last_sequence_number_(0) {} |
574 | 569 |
575 private: | 570 private: |
576 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 571 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
577 RTPHeader header; | 572 RTPHeader header; |
578 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 573 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
579 | 574 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 enum { | 662 enum { |
668 kFirstPacket, | 663 kFirstPacket, |
669 kDropEveryOtherPacketUntilFec, | 664 kDropEveryOtherPacketUntilFec, |
670 kDropAllMediaPacketsUntilFec, | 665 kDropAllMediaPacketsUntilFec, |
671 kVerifyFecPacketNotInNackList, | 666 kVerifyFecPacketNotInNackList, |
672 } state_; | 667 } state_; |
673 | 668 |
674 uint16_t fec_sequence_number_; | 669 uint16_t fec_sequence_number_; |
675 bool has_last_sequence_number_; | 670 bool has_last_sequence_number_; |
676 uint16_t last_sequence_number_; | 671 uint16_t last_sequence_number_; |
677 } test(config); | 672 } test; |
678 | 673 |
679 RunBaseTest(&test); | 674 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. |
| 675 // Configure some network delay. |
| 676 const int kNetworkDelayMs = 50; |
| 677 FakeNetworkPipe::Config config; |
| 678 config.queue_delay_ms = kNetworkDelayMs; |
| 679 RunBaseTest(&test, config); |
680 } | 680 } |
681 | 681 |
682 // This test drops second RTP packet with a marker bit set, makes sure it's | 682 // This test drops second RTP packet with a marker bit set, makes sure it's |
683 // retransmitted and renders. Retransmission SSRCs are also checked. | 683 // retransmitted and renders. Retransmission SSRCs are also checked. |
684 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { | 684 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { |
685 // Must be set high enough to allow the bitrate probing to finish. | 685 // Must be set high enough to allow the bitrate probing to finish. |
686 static const int kMinProbePackets = 30; | 686 static const int kMinProbePackets = 30; |
687 static const int kDroppedFrameNumber = kMinProbePackets + 1; | 687 static const int kDroppedFrameNumber = kMinProbePackets + 1; |
688 class RetransmissionObserver : public test::EndToEndTest, | 688 class RetransmissionObserver : public test::EndToEndTest, |
689 public I420FrameCallback { | 689 public I420FrameCallback { |
690 public: | 690 public: |
691 explicit RetransmissionObserver(bool use_rtx, bool use_red) | 691 explicit RetransmissionObserver(bool use_rtx, bool use_red) |
692 : EndToEndTest(kDefaultTimeoutMs), | 692 : EndToEndTest(kDefaultTimeoutMs), |
693 payload_type_(GetPayloadType(false, use_red)), | 693 payload_type_(GetPayloadType(false, use_red)), |
694 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]), | 694 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]), |
695 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), | 695 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), |
696 marker_bits_observed_(0), | 696 marker_bits_observed_(0), |
697 num_packets_observed_(0), | 697 num_packets_observed_(0), |
698 retransmitted_timestamp_(0), | 698 retransmitted_timestamp_(0), |
699 frame_retransmitted_(false) {} | 699 frame_retransmitted_(false) {} |
700 | 700 |
701 private: | 701 private: |
702 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 702 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 703 rtc::CritScope lock(&crit_); |
703 RTPHeader header; | 704 RTPHeader header; |
704 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 705 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
705 | 706 |
706 // We accept some padding or RTX packets in the beginning to enable | 707 // We accept some padding or RTX packets in the beginning to enable |
707 // bitrate probing. | 708 // bitrate probing. |
708 if (num_packets_observed_++ < kMinProbePackets && | 709 if (num_packets_observed_++ < kMinProbePackets && |
709 header.payloadType != payload_type_) { | 710 header.payloadType != payload_type_) { |
710 EXPECT_TRUE(retransmission_payload_type_ == header.payloadType || | 711 EXPECT_TRUE(retransmission_payload_type_ == header.payloadType || |
711 length == header.headerLength + header.paddingLength); | 712 length == header.headerLength + header.paddingLength); |
712 return SEND_PACKET; | 713 return SEND_PACKET; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 void PerformTest() override { | 767 void PerformTest() override { |
767 EXPECT_EQ(kEventSignaled, Wait()) | 768 EXPECT_EQ(kEventSignaled, Wait()) |
768 << "Timed out while waiting for retransmission to render."; | 769 << "Timed out while waiting for retransmission to render."; |
769 } | 770 } |
770 | 771 |
771 int GetPayloadType(bool use_rtx, bool use_red) { | 772 int GetPayloadType(bool use_rtx, bool use_red) { |
772 return use_rtx ? kSendRtxPayloadType | 773 return use_rtx ? kSendRtxPayloadType |
773 : (use_red ? kRedPayloadType : kFakeSendPayloadType); | 774 : (use_red ? kRedPayloadType : kFakeSendPayloadType); |
774 } | 775 } |
775 | 776 |
| 777 rtc::CriticalSection crit_; |
776 const int payload_type_; | 778 const int payload_type_; |
777 const uint32_t retransmission_ssrc_; | 779 const uint32_t retransmission_ssrc_; |
778 const int retransmission_payload_type_; | 780 const int retransmission_payload_type_; |
779 int marker_bits_observed_; | 781 int marker_bits_observed_; |
780 int num_packets_observed_; | 782 int num_packets_observed_; |
781 uint32_t retransmitted_timestamp_; | 783 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); |
782 bool frame_retransmitted_; | 784 bool frame_retransmitted_; |
783 } test(use_rtx, use_red); | 785 } test(use_rtx, use_red); |
784 | 786 |
785 RunBaseTest(&test); | 787 RunBaseTest(&test, FakeNetworkPipe::Config()); |
786 } | 788 } |
787 | 789 |
788 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { | 790 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { |
789 DecodesRetransmittedFrame(false, false); | 791 DecodesRetransmittedFrame(false, false); |
790 } | 792 } |
791 | 793 |
792 TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) { | 794 TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) { |
793 DecodesRetransmittedFrame(true, false); | 795 DecodesRetransmittedFrame(true, false); |
794 } | 796 } |
795 | 797 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 rtc::scoped_ptr<EventWrapper> event_; | 856 rtc::scoped_ptr<EventWrapper> event_; |
855 int expected_luma_byte_; | 857 int expected_luma_byte_; |
856 int next_luma_byte_; | 858 int next_luma_byte_; |
857 }; | 859 }; |
858 | 860 |
859 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255. | 861 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255. |
860 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0. | 862 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0. |
861 | 863 |
862 CreateCalls(Call::Config(), Call::Config()); | 864 CreateCalls(Call::Config(), Call::Config()); |
863 | 865 |
864 test::DirectTransport sender_transport, receiver_transport; | 866 test::DirectTransport sender_transport(sender_call_.get()); |
| 867 test::DirectTransport receiver_transport(receiver_call_.get()); |
865 sender_transport.SetReceiver(receiver_call_->Receiver()); | 868 sender_transport.SetReceiver(receiver_call_->Receiver()); |
866 receiver_transport.SetReceiver(sender_call_->Receiver()); | 869 receiver_transport.SetReceiver(sender_call_->Receiver()); |
867 | 870 |
868 CreateSendConfig(1, &sender_transport); | 871 CreateSendConfig(1, &sender_transport); |
869 rtc::scoped_ptr<VideoEncoder> encoder( | 872 rtc::scoped_ptr<VideoEncoder> encoder( |
870 VideoEncoder::Create(VideoEncoder::kVp8)); | 873 VideoEncoder::Create(VideoEncoder::kVp8)); |
871 send_config_.encoder_settings.encoder = encoder.get(); | 874 send_config_.encoder_settings.encoder = encoder.get(); |
872 send_config_.encoder_settings.payload_name = "VP8"; | 875 send_config_.encoder_settings.payload_name = "VP8"; |
873 ASSERT_EQ(1u, encoder_config_.streams.size()) << "Test setup error."; | 876 ASSERT_EQ(1u, encoder_config_.streams.size()) << "Test setup error."; |
874 encoder_config_.streams[0].width = kWidth; | 877 encoder_config_.streams[0].width = kWidth; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 explicit PliObserver(int rtp_history_ms) | 914 explicit PliObserver(int rtp_history_ms) |
912 : EndToEndTest(kLongTimeoutMs), | 915 : EndToEndTest(kLongTimeoutMs), |
913 rtp_history_ms_(rtp_history_ms), | 916 rtp_history_ms_(rtp_history_ms), |
914 nack_enabled_(rtp_history_ms > 0), | 917 nack_enabled_(rtp_history_ms > 0), |
915 highest_dropped_timestamp_(0), | 918 highest_dropped_timestamp_(0), |
916 frames_to_drop_(0), | 919 frames_to_drop_(0), |
917 received_pli_(false) {} | 920 received_pli_(false) {} |
918 | 921 |
919 private: | 922 private: |
920 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 923 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 924 rtc::CritScope lock(&crit_); |
921 RTPHeader header; | 925 RTPHeader header; |
922 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 926 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
923 | 927 |
924 // Drop all retransmitted packets to force a PLI. | 928 // Drop all retransmitted packets to force a PLI. |
925 if (header.timestamp <= highest_dropped_timestamp_) | 929 if (header.timestamp <= highest_dropped_timestamp_) |
926 return DROP_PACKET; | 930 return DROP_PACKET; |
927 | 931 |
928 if (frames_to_drop_ > 0) { | 932 if (frames_to_drop_ > 0) { |
929 highest_dropped_timestamp_ = header.timestamp; | 933 highest_dropped_timestamp_ = header.timestamp; |
930 --frames_to_drop_; | 934 --frames_to_drop_; |
931 return DROP_PACKET; | 935 return DROP_PACKET; |
932 } | 936 } |
933 | 937 |
934 return SEND_PACKET; | 938 return SEND_PACKET; |
935 } | 939 } |
936 | 940 |
937 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 941 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
| 942 rtc::CritScope lock(&crit_); |
938 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 943 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
939 EXPECT_TRUE(parser.IsValid()); | 944 EXPECT_TRUE(parser.IsValid()); |
940 | 945 |
941 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); | 946 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); |
942 packet_type != RTCPUtility::RTCPPacketTypes::kInvalid; | 947 packet_type != RTCPUtility::RTCPPacketTypes::kInvalid; |
943 packet_type = parser.Iterate()) { | 948 packet_type = parser.Iterate()) { |
944 if (!nack_enabled_) | 949 if (!nack_enabled_) |
945 EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kRtpfbNack); | 950 EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kRtpfbNack); |
946 | 951 |
947 if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbPli) { | 952 if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbPli) { |
(...skipping 24 matching lines...) Expand all Loading... |
972 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_; | 977 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_; |
973 (*receive_configs)[0].renderer = this; | 978 (*receive_configs)[0].renderer = this; |
974 } | 979 } |
975 | 980 |
976 void PerformTest() override { | 981 void PerformTest() override { |
977 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out waiting for PLI to be " | 982 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out waiting for PLI to be " |
978 "received and a frame to be " | 983 "received and a frame to be " |
979 "rendered afterwards."; | 984 "rendered afterwards."; |
980 } | 985 } |
981 | 986 |
| 987 rtc::CriticalSection crit_; |
982 int rtp_history_ms_; | 988 int rtp_history_ms_; |
983 bool nack_enabled_; | 989 bool nack_enabled_; |
984 uint32_t highest_dropped_timestamp_; | 990 uint32_t highest_dropped_timestamp_ GUARDED_BY(&crit_); |
985 int frames_to_drop_; | 991 int frames_to_drop_ GUARDED_BY(&crit_); |
986 bool received_pli_; | 992 bool received_pli_ GUARDED_BY(&crit_); |
987 } test(rtp_history_ms); | 993 } test(rtp_history_ms); |
988 | 994 |
989 RunBaseTest(&test); | 995 RunBaseTest(&test, FakeNetworkPipe::Config()); |
990 } | 996 } |
991 | 997 |
992 TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) { | 998 TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) { |
993 ReceivesPliAndRecovers(1000); | 999 ReceivesPliAndRecovers(1000); |
994 } | 1000 } |
995 | 1001 |
996 // TODO(pbos): Enable this when 2250 is resolved. | 1002 // TODO(pbos): Enable this when 2250 is resolved. |
997 TEST_F(EndToEndTest, DISABLED_ReceivesPliAndRecoversWithoutNack) { | 1003 TEST_F(EndToEndTest, DISABLED_ReceivesPliAndRecoversWithoutNack) { |
998 ReceivesPliAndRecovers(0); | 1004 ReceivesPliAndRecovers(0); |
999 } | 1005 } |
(...skipping 24 matching lines...) Expand all Loading... |
1024 return delivery_status; | 1030 return delivery_status; |
1025 } | 1031 } |
1026 } | 1032 } |
1027 | 1033 |
1028 PacketReceiver* receiver_; | 1034 PacketReceiver* receiver_; |
1029 rtc::scoped_ptr<EventWrapper> delivered_packet_; | 1035 rtc::scoped_ptr<EventWrapper> delivered_packet_; |
1030 }; | 1036 }; |
1031 | 1037 |
1032 CreateCalls(Call::Config(), Call::Config()); | 1038 CreateCalls(Call::Config(), Call::Config()); |
1033 | 1039 |
1034 test::DirectTransport send_transport, receive_transport; | 1040 test::DirectTransport send_transport(sender_call_.get()); |
| 1041 test::DirectTransport receive_transport(receiver_call_.get()); |
1035 PacketInputObserver input_observer(receiver_call_->Receiver()); | 1042 PacketInputObserver input_observer(receiver_call_->Receiver()); |
1036 send_transport.SetReceiver(&input_observer); | 1043 send_transport.SetReceiver(&input_observer); |
1037 receive_transport.SetReceiver(sender_call_->Receiver()); | 1044 receive_transport.SetReceiver(sender_call_->Receiver()); |
1038 | 1045 |
1039 CreateSendConfig(1, &send_transport); | 1046 CreateSendConfig(1, &send_transport); |
1040 CreateMatchingReceiveConfigs(&receive_transport); | 1047 CreateMatchingReceiveConfigs(&receive_transport); |
1041 | 1048 |
1042 CreateStreams(); | 1049 CreateStreams(); |
1043 CreateFrameGeneratorCapturer(); | 1050 CreateFrameGeneratorCapturer(); |
1044 Start(); | 1051 Start(); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 << (rtcp_mode_ == RtcpMode::kCompound | 1135 << (rtcp_mode_ == RtcpMode::kCompound |
1129 ? "Timed out before observing enough compound packets." | 1136 ? "Timed out before observing enough compound packets." |
1130 : "Timed out before receiving a non-compound RTCP packet."); | 1137 : "Timed out before receiving a non-compound RTCP packet."); |
1131 } | 1138 } |
1132 | 1139 |
1133 RtcpMode rtcp_mode_; | 1140 RtcpMode rtcp_mode_; |
1134 int sent_rtp_; | 1141 int sent_rtp_; |
1135 int sent_rtcp_; | 1142 int sent_rtcp_; |
1136 } test(rtcp_mode); | 1143 } test(rtcp_mode); |
1137 | 1144 |
1138 RunBaseTest(&test); | 1145 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1139 } | 1146 } |
1140 | 1147 |
1141 TEST_F(EndToEndTest, UsesRtcpCompoundMode) { | 1148 TEST_F(EndToEndTest, UsesRtcpCompoundMode) { |
1142 RespectsRtcpMode(RtcpMode::kCompound); | 1149 RespectsRtcpMode(RtcpMode::kCompound); |
1143 } | 1150 } |
1144 | 1151 |
1145 TEST_F(EndToEndTest, UsesRtcpReducedSizeMode) { | 1152 TEST_F(EndToEndTest, UsesRtcpReducedSizeMode) { |
1146 RespectsRtcpMode(RtcpMode::kReducedSize); | 1153 RespectsRtcpMode(RtcpMode::kReducedSize); |
1147 } | 1154 } |
1148 | 1155 |
(...skipping 11 matching lines...) Expand all Loading... |
1160 MultiStreamTest() { | 1167 MultiStreamTest() { |
1161 // TODO(sprang): Cleanup when msvc supports explicit initializers for array. | 1168 // TODO(sprang): Cleanup when msvc supports explicit initializers for array. |
1162 codec_settings[0] = {1, 640, 480}; | 1169 codec_settings[0] = {1, 640, 480}; |
1163 codec_settings[1] = {2, 320, 240}; | 1170 codec_settings[1] = {2, 320, 240}; |
1164 codec_settings[2] = {3, 240, 160}; | 1171 codec_settings[2] = {3, 240, 160}; |
1165 } | 1172 } |
1166 | 1173 |
1167 virtual ~MultiStreamTest() {} | 1174 virtual ~MultiStreamTest() {} |
1168 | 1175 |
1169 void RunTest() { | 1176 void RunTest() { |
1170 rtc::scoped_ptr<test::DirectTransport> sender_transport( | |
1171 CreateSendTransport()); | |
1172 rtc::scoped_ptr<test::DirectTransport> receiver_transport( | |
1173 CreateReceiveTransport()); | |
1174 | |
1175 rtc::scoped_ptr<Call> sender_call(Call::Create(Call::Config())); | 1177 rtc::scoped_ptr<Call> sender_call(Call::Create(Call::Config())); |
1176 rtc::scoped_ptr<Call> receiver_call(Call::Create(Call::Config())); | 1178 rtc::scoped_ptr<Call> receiver_call(Call::Create(Call::Config())); |
| 1179 rtc::scoped_ptr<test::DirectTransport> sender_transport( |
| 1180 CreateSendTransport(sender_call.get())); |
| 1181 rtc::scoped_ptr<test::DirectTransport> receiver_transport( |
| 1182 CreateReceiveTransport(receiver_call.get())); |
1177 sender_transport->SetReceiver(receiver_call->Receiver()); | 1183 sender_transport->SetReceiver(receiver_call->Receiver()); |
1178 receiver_transport->SetReceiver(sender_call->Receiver()); | 1184 receiver_transport->SetReceiver(sender_call->Receiver()); |
1179 | 1185 |
1180 rtc::scoped_ptr<VideoEncoder> encoders[kNumStreams]; | 1186 rtc::scoped_ptr<VideoEncoder> encoders[kNumStreams]; |
1181 for (size_t i = 0; i < kNumStreams; ++i) | 1187 for (size_t i = 0; i < kNumStreams; ++i) |
1182 encoders[i].reset(VideoEncoder::Create(VideoEncoder::kVp8)); | 1188 encoders[i].reset(VideoEncoder::Create(VideoEncoder::kVp8)); |
1183 | 1189 |
1184 VideoSendStream* send_streams[kNumStreams]; | 1190 VideoSendStream* send_streams[kNumStreams]; |
1185 VideoReceiveStream* receive_streams[kNumStreams]; | 1191 VideoReceiveStream* receive_streams[kNumStreams]; |
1186 | 1192 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1250 // hasn't been created at the time of this call. Only when packets/frames | 1256 // hasn't been created at the time of this call. Only when packets/frames |
1251 // start flowing should this be dereferenced. | 1257 // start flowing should this be dereferenced. |
1252 virtual void UpdateSendConfig( | 1258 virtual void UpdateSendConfig( |
1253 size_t stream_index, | 1259 size_t stream_index, |
1254 VideoSendStream::Config* send_config, | 1260 VideoSendStream::Config* send_config, |
1255 VideoEncoderConfig* encoder_config, | 1261 VideoEncoderConfig* encoder_config, |
1256 test::FrameGeneratorCapturer** frame_generator) {} | 1262 test::FrameGeneratorCapturer** frame_generator) {} |
1257 virtual void UpdateReceiveConfig(size_t stream_index, | 1263 virtual void UpdateReceiveConfig(size_t stream_index, |
1258 VideoReceiveStream::Config* receive_config) { | 1264 VideoReceiveStream::Config* receive_config) { |
1259 } | 1265 } |
1260 virtual test::DirectTransport* CreateSendTransport() { | 1266 virtual test::DirectTransport* CreateSendTransport(Call* sender_call) { |
1261 return new test::DirectTransport(); | 1267 return new test::DirectTransport(sender_call); |
1262 } | 1268 } |
1263 virtual test::DirectTransport* CreateReceiveTransport() { | 1269 virtual test::DirectTransport* CreateReceiveTransport(Call* receiver_call) { |
1264 return new test::DirectTransport(); | 1270 return new test::DirectTransport(receiver_call); |
1265 } | 1271 } |
1266 }; | 1272 }; |
1267 | 1273 |
1268 // Each renderer verifies that it receives the expected resolution, and as soon | 1274 // Each renderer verifies that it receives the expected resolution, and as soon |
1269 // as every renderer has received a frame, the test finishes. | 1275 // as every renderer has received a frame, the test finishes. |
1270 TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { | 1276 TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { |
1271 class VideoOutputObserver : public VideoRenderer { | 1277 class VideoOutputObserver : public VideoRenderer { |
1272 public: | 1278 public: |
1273 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings, | 1279 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings, |
1274 uint32_t ssrc, | 1280 uint32_t ssrc, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 } tester; | 1339 } tester; |
1334 | 1340 |
1335 tester.RunTest(); | 1341 tester.RunTest(); |
1336 } | 1342 } |
1337 | 1343 |
1338 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { | 1344 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { |
1339 static const int kExtensionId = 5; | 1345 static const int kExtensionId = 5; |
1340 | 1346 |
1341 class RtpExtensionHeaderObserver : public test::DirectTransport { | 1347 class RtpExtensionHeaderObserver : public test::DirectTransport { |
1342 public: | 1348 public: |
1343 RtpExtensionHeaderObserver(const uint32_t& first_media_ssrc, | 1349 RtpExtensionHeaderObserver(Call* sender_call, |
| 1350 const uint32_t& first_media_ssrc, |
1344 const std::map<uint32_t, uint32_t>& ssrc_map) | 1351 const std::map<uint32_t, uint32_t>& ssrc_map) |
1345 : done_(EventWrapper::Create()), | 1352 : DirectTransport(sender_call), |
| 1353 done_(EventWrapper::Create()), |
1346 parser_(RtpHeaderParser::Create()), | 1354 parser_(RtpHeaderParser::Create()), |
1347 first_media_ssrc_(first_media_ssrc), | 1355 first_media_ssrc_(first_media_ssrc), |
1348 rtx_to_media_ssrcs_(ssrc_map), | 1356 rtx_to_media_ssrcs_(ssrc_map), |
1349 padding_observed_(false), | 1357 padding_observed_(false), |
1350 rtx_padding_observed_(false), | 1358 rtx_padding_observed_(false), |
1351 retransmit_observed_(false), | 1359 retransmit_observed_(false), |
1352 started_(false) { | 1360 started_(false) { |
1353 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, | 1361 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, |
1354 kExtensionId); | 1362 kExtensionId); |
1355 } | 1363 } |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 | 1508 |
1501 void UpdateReceiveConfig( | 1509 void UpdateReceiveConfig( |
1502 size_t stream_index, | 1510 size_t stream_index, |
1503 VideoReceiveStream::Config* receive_config) override { | 1511 VideoReceiveStream::Config* receive_config) override { |
1504 receive_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1512 receive_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1505 receive_config->rtp.extensions.clear(); | 1513 receive_config->rtp.extensions.clear(); |
1506 receive_config->rtp.extensions.push_back( | 1514 receive_config->rtp.extensions.push_back( |
1507 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); | 1515 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
1508 } | 1516 } |
1509 | 1517 |
1510 virtual test::DirectTransport* CreateSendTransport() { | 1518 test::DirectTransport* CreateSendTransport(Call* sender_call) override { |
1511 observer_ = new RtpExtensionHeaderObserver(first_media_ssrc_, | 1519 observer_ = new RtpExtensionHeaderObserver(sender_call, first_media_ssrc_, |
1512 rtx_to_media_ssrcs_); | 1520 rtx_to_media_ssrcs_); |
1513 return observer_; | 1521 return observer_; |
1514 } | 1522 } |
1515 | 1523 |
1516 private: | 1524 private: |
1517 uint32_t first_media_ssrc_; | 1525 uint32_t first_media_ssrc_; |
1518 std::map<uint32_t, uint32_t> rtx_to_media_ssrcs_; | 1526 std::map<uint32_t, uint32_t> rtx_to_media_ssrcs_; |
1519 RtpExtensionHeaderObserver* observer_; | 1527 RtpExtensionHeaderObserver* observer_; |
1520 } tester; | 1528 } tester; |
1521 | 1529 |
1522 tester.RunTest(); | 1530 tester.RunTest(); |
1523 } | 1531 } |
1524 | 1532 |
1525 TEST_F(EndToEndTest, ReceivesTransportFeedback) { | 1533 TEST_F(EndToEndTest, ReceivesTransportFeedback) { |
1526 static const int kExtensionId = 5; | 1534 static const int kExtensionId = 5; |
1527 | 1535 |
1528 class TransportFeedbackObserver : public test::DirectTransport { | 1536 class TransportFeedbackObserver : public test::DirectTransport { |
1529 public: | 1537 public: |
1530 TransportFeedbackObserver(rtc::Event* done_event) : done_(done_event) {} | 1538 TransportFeedbackObserver(Call* receiver_call, rtc::Event* done_event) |
| 1539 : DirectTransport(receiver_call), done_(done_event) {} |
1531 virtual ~TransportFeedbackObserver() {} | 1540 virtual ~TransportFeedbackObserver() {} |
1532 | 1541 |
1533 bool SendRtcp(const uint8_t* data, size_t length) override { | 1542 bool SendRtcp(const uint8_t* data, size_t length) override { |
1534 RTCPUtility::RTCPParserV2 parser(data, length, true); | 1543 RTCPUtility::RTCPParserV2 parser(data, length, true); |
1535 EXPECT_TRUE(parser.IsValid()); | 1544 EXPECT_TRUE(parser.IsValid()); |
1536 | 1545 |
1537 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); | 1546 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); |
1538 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { | 1547 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { |
1539 if (packet_type == RTCPUtility::RTCPPacketTypes::kTransportFeedback) { | 1548 if (packet_type == RTCPUtility::RTCPPacketTypes::kTransportFeedback) { |
1540 done_->Set(); | 1549 done_->Set(); |
(...skipping 27 matching lines...) Expand all Loading... |
1568 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); | 1577 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
1569 } | 1578 } |
1570 | 1579 |
1571 void UpdateReceiveConfig( | 1580 void UpdateReceiveConfig( |
1572 size_t stream_index, | 1581 size_t stream_index, |
1573 VideoReceiveStream::Config* receive_config) override { | 1582 VideoReceiveStream::Config* receive_config) override { |
1574 receive_config->rtp.extensions.push_back( | 1583 receive_config->rtp.extensions.push_back( |
1575 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); | 1584 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
1576 } | 1585 } |
1577 | 1586 |
1578 virtual test::DirectTransport* CreateReceiveTransport() { | 1587 test::DirectTransport* CreateReceiveTransport( |
1579 return new TransportFeedbackObserver(&done_); | 1588 Call* receiver_call) override { |
| 1589 return new TransportFeedbackObserver(receiver_call, &done_); |
1580 } | 1590 } |
1581 | 1591 |
1582 private: | 1592 private: |
1583 rtc::Event done_; | 1593 rtc::Event done_; |
1584 } tester; | 1594 } tester; |
1585 tester.RunTest(); | 1595 tester.RunTest(); |
1586 } | 1596 } |
1587 TEST_F(EndToEndTest, ObserversEncodedFrames) { | 1597 TEST_F(EndToEndTest, ObserversEncodedFrames) { |
1588 class EncodedFrameTestObserver : public EncodedFrameObserver { | 1598 class EncodedFrameTestObserver : public EncodedFrameObserver { |
1589 public: | 1599 public: |
(...skipping 27 matching lines...) Expand all Loading... |
1617 size_t length_; | 1627 size_t length_; |
1618 FrameType frame_type_; | 1628 FrameType frame_type_; |
1619 rtc::scoped_ptr<EventWrapper> called_; | 1629 rtc::scoped_ptr<EventWrapper> called_; |
1620 }; | 1630 }; |
1621 | 1631 |
1622 EncodedFrameTestObserver post_encode_observer; | 1632 EncodedFrameTestObserver post_encode_observer; |
1623 EncodedFrameTestObserver pre_decode_observer; | 1633 EncodedFrameTestObserver pre_decode_observer; |
1624 | 1634 |
1625 CreateCalls(Call::Config(), Call::Config()); | 1635 CreateCalls(Call::Config(), Call::Config()); |
1626 | 1636 |
1627 test::DirectTransport sender_transport, receiver_transport; | 1637 test::DirectTransport sender_transport(sender_call_.get()); |
| 1638 test::DirectTransport receiver_transport(receiver_call_.get()); |
1628 sender_transport.SetReceiver(receiver_call_->Receiver()); | 1639 sender_transport.SetReceiver(receiver_call_->Receiver()); |
1629 receiver_transport.SetReceiver(sender_call_->Receiver()); | 1640 receiver_transport.SetReceiver(sender_call_->Receiver()); |
1630 | 1641 |
1631 CreateSendConfig(1, &sender_transport); | 1642 CreateSendConfig(1, &sender_transport); |
1632 CreateMatchingReceiveConfigs(&receiver_transport); | 1643 CreateMatchingReceiveConfigs(&receiver_transport); |
1633 send_config_.post_encode_callback = &post_encode_observer; | 1644 send_config_.post_encode_callback = &post_encode_observer; |
1634 receive_configs_[0].pre_decode_callback = &pre_decode_observer; | 1645 receive_configs_[0].pre_decode_callback = &pre_decode_observer; |
1635 | 1646 |
1636 CreateStreams(); | 1647 CreateStreams(); |
1637 Start(); | 1648 Start(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1687 observation_complete_->Set(); | 1698 observation_complete_->Set(); |
1688 return SEND_PACKET; | 1699 return SEND_PACKET; |
1689 } | 1700 } |
1690 void PerformTest() override { | 1701 void PerformTest() override { |
1691 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for a " | 1702 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for a " |
1692 "receiver RTCP REMB packet to be " | 1703 "receiver RTCP REMB packet to be " |
1693 "sent."; | 1704 "sent."; |
1694 } | 1705 } |
1695 } test; | 1706 } test; |
1696 | 1707 |
1697 RunBaseTest(&test); | 1708 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1698 } | 1709 } |
1699 | 1710 |
1700 TEST_F(EndToEndTest, VerifyBandwidthStats) { | 1711 TEST_F(EndToEndTest, VerifyBandwidthStats) { |
1701 class RtcpObserver : public test::EndToEndTest, public PacketReceiver { | 1712 class RtcpObserver : public test::EndToEndTest { |
1702 public: | 1713 public: |
1703 RtcpObserver() | 1714 RtcpObserver() |
1704 : EndToEndTest(kDefaultTimeoutMs), | 1715 : EndToEndTest(kDefaultTimeoutMs), |
1705 sender_call_(nullptr), | 1716 sender_call_(nullptr), |
1706 receiver_call_(nullptr), | 1717 receiver_call_(nullptr), |
1707 has_seen_pacer_delay_(false) {} | 1718 has_seen_pacer_delay_(false) {} |
1708 | 1719 |
1709 DeliveryStatus DeliverPacket(MediaType media_type, | 1720 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
1710 const uint8_t* packet, | |
1711 size_t length, | |
1712 const PacketTime& packet_time) override { | |
1713 Call::Stats sender_stats = sender_call_->GetStats(); | 1721 Call::Stats sender_stats = sender_call_->GetStats(); |
1714 Call::Stats receiver_stats = receiver_call_->GetStats(); | 1722 Call::Stats receiver_stats = receiver_call_->GetStats(); |
1715 if (!has_seen_pacer_delay_) | 1723 if (!has_seen_pacer_delay_) |
1716 has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0; | 1724 has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0; |
1717 if (sender_stats.send_bandwidth_bps > 0 && | 1725 if (sender_stats.send_bandwidth_bps > 0 && |
1718 receiver_stats.recv_bandwidth_bps > 0 && has_seen_pacer_delay_) { | 1726 receiver_stats.recv_bandwidth_bps > 0 && has_seen_pacer_delay_) { |
1719 observation_complete_->Set(); | 1727 observation_complete_->Set(); |
1720 } | 1728 } |
1721 return receiver_call_->Receiver()->DeliverPacket(media_type, packet, | 1729 return SEND_PACKET; |
1722 length, packet_time); | |
1723 } | 1730 } |
1724 | 1731 |
1725 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 1732 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
1726 sender_call_ = sender_call; | 1733 sender_call_ = sender_call; |
1727 receiver_call_ = receiver_call; | 1734 receiver_call_ = receiver_call; |
1728 } | 1735 } |
1729 | 1736 |
1730 void PerformTest() override { | 1737 void PerformTest() override { |
1731 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for " | 1738 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for " |
1732 "non-zero bandwidth stats."; | 1739 "non-zero bandwidth stats."; |
1733 } | 1740 } |
1734 | 1741 |
1735 void SetReceivers(PacketReceiver* send_transport_receiver, | |
1736 PacketReceiver* receive_transport_receiver) override { | |
1737 test::RtpRtcpObserver::SetReceivers(this, receive_transport_receiver); | |
1738 } | |
1739 | |
1740 private: | 1742 private: |
1741 Call* sender_call_; | 1743 Call* sender_call_; |
1742 Call* receiver_call_; | 1744 Call* receiver_call_; |
1743 bool has_seen_pacer_delay_; | 1745 bool has_seen_pacer_delay_; |
1744 } test; | 1746 } test; |
1745 | 1747 |
1746 RunBaseTest(&test); | 1748 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1747 } | 1749 } |
1748 | 1750 |
1749 TEST_F(EndToEndTest, VerifyNackStats) { | 1751 TEST_F(EndToEndTest, VerifyNackStats) { |
1750 static const int kPacketNumberToDrop = 200; | 1752 static const int kPacketNumberToDrop = 200; |
1751 class NackObserver : public test::EndToEndTest { | 1753 class NackObserver : public test::EndToEndTest { |
1752 public: | 1754 public: |
1753 NackObserver() | 1755 NackObserver() |
1754 : EndToEndTest(kLongTimeoutMs), | 1756 : EndToEndTest(kLongTimeoutMs), |
1755 sent_rtp_packets_(0), | 1757 sent_rtp_packets_(0), |
1756 dropped_rtp_packet_(0), | 1758 dropped_rtp_packet_(0), |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1837 | 1839 |
1838 uint64_t sent_rtp_packets_; | 1840 uint64_t sent_rtp_packets_; |
1839 uint16_t dropped_rtp_packet_; | 1841 uint16_t dropped_rtp_packet_; |
1840 bool dropped_rtp_packet_requested_; | 1842 bool dropped_rtp_packet_requested_; |
1841 std::vector<VideoReceiveStream*> receive_streams_; | 1843 std::vector<VideoReceiveStream*> receive_streams_; |
1842 VideoSendStream* send_stream_; | 1844 VideoSendStream* send_stream_; |
1843 int64_t start_runtime_ms_; | 1845 int64_t start_runtime_ms_; |
1844 } test; | 1846 } test; |
1845 | 1847 |
1846 test::ClearHistograms(); | 1848 test::ClearHistograms(); |
1847 RunBaseTest(&test); | 1849 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1848 | 1850 |
1849 EXPECT_EQ(1, test::NumHistogramSamples( | 1851 EXPECT_EQ(1, test::NumHistogramSamples( |
1850 "WebRTC.Video.UniqueNackRequestsSentInPercent")); | 1852 "WebRTC.Video.UniqueNackRequestsSentInPercent")); |
1851 EXPECT_EQ(1, test::NumHistogramSamples( | 1853 EXPECT_EQ(1, test::NumHistogramSamples( |
1852 "WebRTC.Video.UniqueNackRequestsReceivedInPercent")); | 1854 "WebRTC.Video.UniqueNackRequestsReceivedInPercent")); |
1853 EXPECT_GT(test::LastHistogramSample( | 1855 EXPECT_GT(test::LastHistogramSample( |
1854 "WebRTC.Video.NackPacketsSentPerMinute"), 0); | 1856 "WebRTC.Video.NackPacketsSentPerMinute"), 0); |
1855 EXPECT_GT(test::LastHistogramSample( | 1857 EXPECT_GT(test::LastHistogramSample( |
1856 "WebRTC.Video.NackPacketsReceivedPerMinute"), 0); | 1858 "WebRTC.Video.NackPacketsReceivedPerMinute"), 0); |
1857 } | 1859 } |
1858 | 1860 |
1859 void EndToEndTest::VerifyHistogramStats(bool use_rtx, bool use_red) { | 1861 void EndToEndTest::VerifyHistogramStats(bool use_rtx, bool use_red) { |
1860 class StatsObserver : public test::EndToEndTest, public PacketReceiver { | 1862 class StatsObserver : public test::EndToEndTest { |
1861 public: | 1863 public: |
1862 StatsObserver(bool use_rtx, bool use_red) | 1864 StatsObserver(bool use_rtx, bool use_red) |
1863 : EndToEndTest(kLongTimeoutMs), | 1865 : EndToEndTest(kLongTimeoutMs), |
1864 use_rtx_(use_rtx), | 1866 use_rtx_(use_rtx), |
1865 use_red_(use_red), | 1867 use_red_(use_red), |
1866 sender_call_(nullptr), | 1868 sender_call_(nullptr), |
1867 receiver_call_(nullptr), | 1869 receiver_call_(nullptr), |
1868 start_runtime_ms_(-1) {} | 1870 start_runtime_ms_(-1) {} |
1869 | 1871 |
1870 private: | 1872 private: |
1871 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 1873 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
1872 if (MinMetricRunTimePassed()) | 1874 if (MinMetricRunTimePassed()) |
1873 observation_complete_->Set(); | 1875 observation_complete_->Set(); |
1874 | 1876 |
1875 return SEND_PACKET; | |
1876 } | |
1877 | |
1878 DeliveryStatus DeliverPacket(MediaType media_type, | |
1879 const uint8_t* packet, | |
1880 size_t length, | |
1881 const PacketTime& packet_time) override { | |
1882 // GetStats calls GetSendChannelRtcpStatistics | 1877 // GetStats calls GetSendChannelRtcpStatistics |
1883 // (via VideoSendStream::GetRtt) which updates ReportBlockStats used by | 1878 // (via VideoSendStream::GetRtt) which updates ReportBlockStats used by |
1884 // WebRTC.Video.SentPacketsLostInPercent. | 1879 // WebRTC.Video.SentPacketsLostInPercent. |
1885 // TODO(asapersson): Remove dependency on calling GetStats. | 1880 // TODO(asapersson): Remove dependency on calling GetStats. |
1886 sender_call_->GetStats(); | 1881 sender_call_->GetStats(); |
1887 return receiver_call_->Receiver()->DeliverPacket(media_type, packet, | 1882 |
1888 length, packet_time); | 1883 return SEND_PACKET; |
1889 } | 1884 } |
1890 | 1885 |
1891 bool MinMetricRunTimePassed() { | 1886 bool MinMetricRunTimePassed() { |
1892 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); | 1887 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); |
1893 if (start_runtime_ms_ == -1) { | 1888 if (start_runtime_ms_ == -1) { |
1894 start_runtime_ms_ = now; | 1889 start_runtime_ms_ = now; |
1895 return false; | 1890 return false; |
1896 } | 1891 } |
1897 int64_t elapsed_sec = (now - start_runtime_ms_) / 1000; | 1892 int64_t elapsed_sec = (now - start_runtime_ms_) / 1000; |
1898 return elapsed_sec > metrics::kMinRunTimeInSeconds * 2; | 1893 return elapsed_sec > metrics::kMinRunTimeInSeconds * 2; |
(...skipping 21 matching lines...) Expand all Loading... |
1920 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = | 1915 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = |
1921 kSendRtxPayloadType; | 1916 kSendRtxPayloadType; |
1922 } | 1917 } |
1923 } | 1918 } |
1924 | 1919 |
1925 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 1920 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
1926 sender_call_ = sender_call; | 1921 sender_call_ = sender_call; |
1927 receiver_call_ = receiver_call; | 1922 receiver_call_ = receiver_call; |
1928 } | 1923 } |
1929 | 1924 |
1930 void SetReceivers(PacketReceiver* send_transport_receiver, | |
1931 PacketReceiver* receive_transport_receiver) override { | |
1932 test::RtpRtcpObserver::SetReceivers(this, receive_transport_receiver); | |
1933 } | |
1934 | |
1935 void PerformTest() override { | 1925 void PerformTest() override { |
1936 EXPECT_EQ(kEventSignaled, Wait()) | 1926 EXPECT_EQ(kEventSignaled, Wait()) |
1937 << "Timed out waiting for packet to be NACKed."; | 1927 << "Timed out waiting for packet to be NACKed."; |
1938 } | 1928 } |
1939 | 1929 |
1940 bool use_rtx_; | 1930 bool use_rtx_; |
1941 bool use_red_; | 1931 bool use_red_; |
1942 Call* sender_call_; | 1932 Call* sender_call_; |
1943 Call* receiver_call_; | 1933 Call* receiver_call_; |
1944 int64_t start_runtime_ms_; | 1934 int64_t start_runtime_ms_; |
1945 } test(use_rtx, use_red); | 1935 } test(use_rtx, use_red); |
1946 | 1936 |
1947 test::ClearHistograms(); | 1937 test::ClearHistograms(); |
1948 RunBaseTest(&test); | 1938 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1949 | 1939 |
1950 // Verify that stats have been updated once. | 1940 // Verify that stats have been updated once. |
1951 EXPECT_EQ(1, test::NumHistogramSamples( | 1941 EXPECT_EQ(1, test::NumHistogramSamples( |
1952 "WebRTC.Video.NackPacketsSentPerMinute")); | 1942 "WebRTC.Video.NackPacketsSentPerMinute")); |
1953 EXPECT_EQ(1, test::NumHistogramSamples( | 1943 EXPECT_EQ(1, test::NumHistogramSamples( |
1954 "WebRTC.Video.NackPacketsReceivedPerMinute")); | 1944 "WebRTC.Video.NackPacketsReceivedPerMinute")); |
1955 EXPECT_EQ(1, test::NumHistogramSamples( | 1945 EXPECT_EQ(1, test::NumHistogramSamples( |
1956 "WebRTC.Video.FirPacketsSentPerMinute")); | 1946 "WebRTC.Video.FirPacketsSentPerMinute")); |
1957 EXPECT_EQ(1, test::NumHistogramSamples( | 1947 EXPECT_EQ(1, test::NumHistogramSamples( |
1958 "WebRTC.Video.FirPacketsReceivedPerMinute")); | 1948 "WebRTC.Video.FirPacketsReceivedPerMinute")); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2122 << "Timed out while waiting for RTCP SR/RR packets to be sent."; | 2112 << "Timed out while waiting for RTCP SR/RR packets to be sent."; |
2123 } | 2113 } |
2124 | 2114 |
2125 bool enable_rrtr_; | 2115 bool enable_rrtr_; |
2126 int sent_rtcp_sr_; | 2116 int sent_rtcp_sr_; |
2127 int sent_rtcp_rr_; | 2117 int sent_rtcp_rr_; |
2128 int sent_rtcp_rrtr_; | 2118 int sent_rtcp_rrtr_; |
2129 int sent_rtcp_dlrr_; | 2119 int sent_rtcp_dlrr_; |
2130 } test(enable_rrtr); | 2120 } test(enable_rrtr); |
2131 | 2121 |
2132 RunBaseTest(&test); | 2122 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2133 } | 2123 } |
2134 | 2124 |
2135 void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, | 2125 void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, |
2136 bool send_single_ssrc_first) { | 2126 bool send_single_ssrc_first) { |
2137 class SendsSetSsrcs : public test::EndToEndTest { | 2127 class SendsSetSsrcs : public test::EndToEndTest { |
2138 public: | 2128 public: |
2139 SendsSetSsrcs(const uint32_t* ssrcs, | 2129 SendsSetSsrcs(const uint32_t* ssrcs, |
2140 size_t num_ssrcs, | 2130 size_t num_ssrcs, |
2141 bool send_single_ssrc_first) | 2131 bool send_single_ssrc_first) |
2142 : EndToEndTest(kDefaultTimeoutMs), | 2132 : EndToEndTest(kDefaultTimeoutMs), |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2220 const size_t num_ssrcs_; | 2210 const size_t num_ssrcs_; |
2221 const bool send_single_ssrc_first_; | 2211 const bool send_single_ssrc_first_; |
2222 | 2212 |
2223 size_t ssrcs_to_observe_; | 2213 size_t ssrcs_to_observe_; |
2224 bool expect_single_ssrc_; | 2214 bool expect_single_ssrc_; |
2225 | 2215 |
2226 VideoSendStream* send_stream_; | 2216 VideoSendStream* send_stream_; |
2227 VideoEncoderConfig encoder_config_all_streams_; | 2217 VideoEncoderConfig encoder_config_all_streams_; |
2228 } test(kSendSsrcs, num_ssrcs, send_single_ssrc_first); | 2218 } test(kSendSsrcs, num_ssrcs, send_single_ssrc_first); |
2229 | 2219 |
2230 RunBaseTest(&test); | 2220 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2231 } | 2221 } |
2232 | 2222 |
2233 TEST_F(EndToEndTest, ReportsSetEncoderRates) { | 2223 TEST_F(EndToEndTest, ReportsSetEncoderRates) { |
2234 class EncoderRateStatsTest : public test::EndToEndTest, | 2224 class EncoderRateStatsTest : public test::EndToEndTest, |
2235 public test::FakeEncoder { | 2225 public test::FakeEncoder { |
2236 public: | 2226 public: |
2237 EncoderRateStatsTest() | 2227 EncoderRateStatsTest() |
2238 : EndToEndTest(kDefaultTimeoutMs), | 2228 : EndToEndTest(kDefaultTimeoutMs), |
2239 FakeEncoder(Clock::GetRealTimeClock()), | 2229 FakeEncoder(Clock::GetRealTimeClock()), |
2240 send_stream_(nullptr), | 2230 send_stream_(nullptr), |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2275 return; | 2265 return; |
2276 } | 2266 } |
2277 } | 2267 } |
2278 SleepMs(1); | 2268 SleepMs(1); |
2279 } | 2269 } |
2280 FAIL() | 2270 FAIL() |
2281 << "Timed out waiting for stats reporting the currently set bitrate."; | 2271 << "Timed out waiting for stats reporting the currently set bitrate."; |
2282 } | 2272 } |
2283 | 2273 |
2284 private: | 2274 private: |
| 2275 rtc::CriticalSection crit_; |
2285 VideoSendStream* send_stream_; | 2276 VideoSendStream* send_stream_; |
2286 uint32_t bitrate_kbps_ GUARDED_BY(crit_); | 2277 uint32_t bitrate_kbps_ GUARDED_BY(crit_); |
2287 } test; | 2278 } test; |
2288 | 2279 |
2289 RunBaseTest(&test); | 2280 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2290 } | 2281 } |
2291 | 2282 |
2292 TEST_F(EndToEndTest, GetStats) { | 2283 TEST_F(EndToEndTest, GetStats) { |
2293 static const int kStartBitrateBps = 3000000; | 2284 static const int kStartBitrateBps = 3000000; |
2294 static const int kExpectedRenderDelayMs = 20; | 2285 static const int kExpectedRenderDelayMs = 20; |
2295 class StatsObserver : public test::EndToEndTest, public I420FrameCallback { | 2286 class StatsObserver : public test::EndToEndTest, public I420FrameCallback { |
2296 public: | 2287 public: |
2297 explicit StatsObserver(const FakeNetworkPipe::Config& config) | 2288 StatsObserver() |
2298 : EndToEndTest(kLongTimeoutMs, config), | 2289 : EndToEndTest(kLongTimeoutMs), |
2299 send_stream_(nullptr), | 2290 send_stream_(nullptr), |
2300 expected_send_ssrcs_(), | 2291 expected_send_ssrcs_(), |
2301 check_stats_event_(EventWrapper::Create()) {} | 2292 check_stats_event_(EventWrapper::Create()) {} |
2302 | 2293 |
2303 private: | 2294 private: |
2304 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 2295 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
2305 check_stats_event_->Set(); | 2296 check_stats_event_->Set(); |
2306 return SEND_PACKET; | 2297 return SEND_PACKET; |
2307 } | 2298 } |
2308 | 2299 |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2535 std::map<std::string, bool> receive_stats_filled_; | 2526 std::map<std::string, bool> receive_stats_filled_; |
2536 | 2527 |
2537 VideoSendStream* send_stream_; | 2528 VideoSendStream* send_stream_; |
2538 std::map<std::string, bool> send_stats_filled_; | 2529 std::map<std::string, bool> send_stats_filled_; |
2539 | 2530 |
2540 std::vector<uint32_t> expected_receive_ssrcs_; | 2531 std::vector<uint32_t> expected_receive_ssrcs_; |
2541 std::set<uint32_t> expected_send_ssrcs_; | 2532 std::set<uint32_t> expected_send_ssrcs_; |
2542 std::string expected_cname_; | 2533 std::string expected_cname_; |
2543 | 2534 |
2544 rtc::scoped_ptr<EventWrapper> check_stats_event_; | 2535 rtc::scoped_ptr<EventWrapper> check_stats_event_; |
2545 }; | 2536 } test; |
2546 | 2537 |
2547 FakeNetworkPipe::Config network_config; | 2538 FakeNetworkPipe::Config network_config; |
2548 network_config.loss_percent = 5; | 2539 network_config.loss_percent = 5; |
2549 | 2540 RunBaseTest(&test, network_config); |
2550 StatsObserver test(network_config); | |
2551 RunBaseTest(&test); | |
2552 } | 2541 } |
2553 | 2542 |
2554 TEST_F(EndToEndTest, ReceiverReferenceTimeReportEnabled) { | 2543 TEST_F(EndToEndTest, ReceiverReferenceTimeReportEnabled) { |
2555 TestXrReceiverReferenceTimeReport(true); | 2544 TestXrReceiverReferenceTimeReport(true); |
2556 } | 2545 } |
2557 | 2546 |
2558 TEST_F(EndToEndTest, ReceiverReferenceTimeReportDisabled) { | 2547 TEST_F(EndToEndTest, ReceiverReferenceTimeReportDisabled) { |
2559 TestXrReceiverReferenceTimeReport(false); | 2548 TestXrReceiverReferenceTimeReport(false); |
2560 } | 2549 } |
2561 | 2550 |
(...skipping 27 matching lines...) Expand all Loading... |
2589 | 2578 |
2590 void PerformTest() override { | 2579 void PerformTest() override { |
2591 EXPECT_EQ(kEventSignaled, Wait()) | 2580 EXPECT_EQ(kEventSignaled, Wait()) |
2592 << "Timed out while verifying number of received RTP packets."; | 2581 << "Timed out while verifying number of received RTP packets."; |
2593 } | 2582 } |
2594 | 2583 |
2595 VideoReceiveStream* receive_stream_; | 2584 VideoReceiveStream* receive_stream_; |
2596 uint32_t sent_rtp_; | 2585 uint32_t sent_rtp_; |
2597 } test; | 2586 } test; |
2598 | 2587 |
2599 RunBaseTest(&test); | 2588 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2600 } | 2589 } |
2601 | 2590 |
2602 TEST_F(EndToEndTest, SendsSetSsrc) { TestSendsSetSsrcs(1, false); } | 2591 TEST_F(EndToEndTest, SendsSetSsrc) { TestSendsSetSsrcs(1, false); } |
2603 | 2592 |
2604 TEST_F(EndToEndTest, SendsSetSimulcastSsrcs) { | 2593 TEST_F(EndToEndTest, SendsSetSimulcastSsrcs) { |
2605 TestSendsSetSsrcs(kNumSsrcs, false); | 2594 TestSendsSetSsrcs(kNumSsrcs, false); |
2606 } | 2595 } |
2607 | 2596 |
2608 TEST_F(EndToEndTest, CanSwitchToUseAllSsrcs) { | 2597 TEST_F(EndToEndTest, CanSwitchToUseAllSsrcs) { |
2609 TestSendsSetSsrcs(kNumSsrcs, true); | 2598 TestSendsSetSsrcs(kNumSsrcs, true); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2669 EXPECT_EQ(kEventSignaled, Wait()) | 2658 EXPECT_EQ(kEventSignaled, Wait()) |
2670 << "Timed out while waiting for redundant payloads on all SSRCs."; | 2659 << "Timed out while waiting for redundant payloads on all SSRCs."; |
2671 } | 2660 } |
2672 | 2661 |
2673 private: | 2662 private: |
2674 size_t ssrcs_to_observe_; | 2663 size_t ssrcs_to_observe_; |
2675 std::map<uint32_t, bool> observed_redundant_retransmission_; | 2664 std::map<uint32_t, bool> observed_redundant_retransmission_; |
2676 std::map<uint32_t, bool> registered_rtx_ssrc_; | 2665 std::map<uint32_t, bool> registered_rtx_ssrc_; |
2677 } test; | 2666 } test; |
2678 | 2667 |
2679 RunBaseTest(&test); | 2668 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2680 } | 2669 } |
2681 | 2670 |
2682 void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { | 2671 void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
2683 static const uint32_t kMaxSequenceNumberGap = 100; | 2672 static const uint32_t kMaxSequenceNumberGap = 100; |
2684 static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90; | 2673 static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90; |
2685 class RtpSequenceObserver : public test::RtpRtcpObserver { | 2674 class RtpSequenceObserver : public test::RtpRtcpObserver { |
2686 public: | 2675 public: |
2687 explicit RtpSequenceObserver(bool use_rtx) | 2676 explicit RtpSequenceObserver(bool use_rtx) |
2688 : test::RtpRtcpObserver(kDefaultTimeoutMs), | 2677 : test::RtpRtcpObserver(kDefaultTimeoutMs), |
2689 ssrcs_to_observe_(kNumSsrcs) { | 2678 ssrcs_to_observe_(kNumSsrcs) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2764 std::map<uint32_t, uint16_t> last_observed_sequence_number_; | 2753 std::map<uint32_t, uint16_t> last_observed_sequence_number_; |
2765 std::map<uint32_t, uint32_t> last_observed_timestamp_; | 2754 std::map<uint32_t, uint32_t> last_observed_timestamp_; |
2766 std::map<uint32_t, bool> configured_ssrcs_; | 2755 std::map<uint32_t, bool> configured_ssrcs_; |
2767 | 2756 |
2768 rtc::CriticalSection crit_; | 2757 rtc::CriticalSection crit_; |
2769 size_t ssrcs_to_observe_ GUARDED_BY(crit_); | 2758 size_t ssrcs_to_observe_ GUARDED_BY(crit_); |
2770 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); | 2759 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); |
2771 } observer(use_rtx); | 2760 } observer(use_rtx); |
2772 | 2761 |
2773 CreateCalls(Call::Config(), Call::Config()); | 2762 CreateCalls(Call::Config(), Call::Config()); |
2774 observer.SetReceivers(sender_call_->Receiver(), nullptr); | |
2775 | 2763 |
2776 CreateSendConfig(kNumSsrcs, observer.SendTransport()); | 2764 test::PacketTransport send_transport(sender_call_.get(), &observer, |
| 2765 test::PacketTransport::kSender, |
| 2766 FakeNetworkPipe::Config()); |
| 2767 test::PacketTransport receive_transport(nullptr, &observer, |
| 2768 test::PacketTransport::kReceiver, |
| 2769 FakeNetworkPipe::Config()); |
| 2770 send_transport.SetReceiver(receiver_call_->Receiver()); |
| 2771 receive_transport.SetReceiver(sender_call_->Receiver()); |
| 2772 |
| 2773 CreateSendConfig(kNumSsrcs, &send_transport); |
2777 | 2774 |
2778 if (use_rtx) { | 2775 if (use_rtx) { |
2779 for (size_t i = 0; i < kNumSsrcs; ++i) { | 2776 for (size_t i = 0; i < kNumSsrcs; ++i) { |
2780 send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); | 2777 send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); |
2781 } | 2778 } |
2782 send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; | 2779 send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; |
2783 } | 2780 } |
2784 | 2781 |
2785 // Lower bitrates so that all streams send initially. | 2782 // Lower bitrates so that all streams send initially. |
2786 for (size_t i = 0; i < encoder_config_.streams.size(); ++i) { | 2783 for (size_t i = 0; i < encoder_config_.streams.size(); ++i) { |
2787 encoder_config_.streams[i].min_bitrate_bps = 10000; | 2784 encoder_config_.streams[i].min_bitrate_bps = 10000; |
2788 encoder_config_.streams[i].target_bitrate_bps = 15000; | 2785 encoder_config_.streams[i].target_bitrate_bps = 15000; |
2789 encoder_config_.streams[i].max_bitrate_bps = 20000; | 2786 encoder_config_.streams[i].max_bitrate_bps = 20000; |
2790 } | 2787 } |
2791 | 2788 |
2792 // Use the same total bitrates when sending a single stream to avoid lowering | 2789 // Use the same total bitrates when sending a single stream to avoid lowering |
2793 // the bitrate estimate and requiring a subsequent rampup. | 2790 // the bitrate estimate and requiring a subsequent rampup. |
2794 VideoEncoderConfig one_stream = encoder_config_; | 2791 VideoEncoderConfig one_stream = encoder_config_; |
2795 one_stream.streams.resize(1); | 2792 one_stream.streams.resize(1); |
2796 for (size_t i = 1; i < encoder_config_.streams.size(); ++i) { | 2793 for (size_t i = 1; i < encoder_config_.streams.size(); ++i) { |
2797 one_stream.streams.front().min_bitrate_bps += | 2794 one_stream.streams.front().min_bitrate_bps += |
2798 encoder_config_.streams[i].min_bitrate_bps; | 2795 encoder_config_.streams[i].min_bitrate_bps; |
2799 one_stream.streams.front().target_bitrate_bps += | 2796 one_stream.streams.front().target_bitrate_bps += |
2800 encoder_config_.streams[i].target_bitrate_bps; | 2797 encoder_config_.streams[i].target_bitrate_bps; |
2801 one_stream.streams.front().max_bitrate_bps += | 2798 one_stream.streams.front().max_bitrate_bps += |
2802 encoder_config_.streams[i].max_bitrate_bps; | 2799 encoder_config_.streams[i].max_bitrate_bps; |
2803 } | 2800 } |
2804 | 2801 |
2805 CreateMatchingReceiveConfigs(observer.ReceiveTransport()); | 2802 CreateMatchingReceiveConfigs(&receive_transport); |
2806 | 2803 |
2807 CreateStreams(); | 2804 CreateStreams(); |
2808 CreateFrameGeneratorCapturer(); | 2805 CreateFrameGeneratorCapturer(); |
2809 | 2806 |
2810 Start(); | 2807 Start(); |
2811 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2808 EXPECT_EQ(kEventSignaled, observer.Wait()) |
2812 << "Timed out waiting for all SSRCs to send packets."; | 2809 << "Timed out waiting for all SSRCs to send packets."; |
2813 | 2810 |
2814 // Test stream resetting more than once to make sure that the state doesn't | 2811 // Test stream resetting more than once to make sure that the state doesn't |
2815 // get set once (this could be due to using std::map::insert for instance). | 2812 // get set once (this could be due to using std::map::insert for instance). |
(...skipping 24 matching lines...) Expand all Loading... |
2840 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2837 EXPECT_EQ(kEventSignaled, observer.Wait()) |
2841 << "Timed out waiting for single RTP packet."; | 2838 << "Timed out waiting for single RTP packet."; |
2842 | 2839 |
2843 // Reconfigure back to use all streams. | 2840 // Reconfigure back to use all streams. |
2844 send_stream_->ReconfigureVideoEncoder(encoder_config_); | 2841 send_stream_->ReconfigureVideoEncoder(encoder_config_); |
2845 observer.ResetExpectedSsrcs(kNumSsrcs); | 2842 observer.ResetExpectedSsrcs(kNumSsrcs); |
2846 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2843 EXPECT_EQ(kEventSignaled, observer.Wait()) |
2847 << "Timed out waiting for all SSRCs to send packets."; | 2844 << "Timed out waiting for all SSRCs to send packets."; |
2848 } | 2845 } |
2849 | 2846 |
2850 observer.StopSending(); | 2847 send_transport.StopSending(); |
| 2848 receive_transport.StopSending(); |
2851 | 2849 |
2852 Stop(); | 2850 Stop(); |
2853 DestroyStreams(); | 2851 DestroyStreams(); |
2854 } | 2852 } |
2855 | 2853 |
2856 TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpState) { | 2854 TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpState) { |
2857 TestRtpStatePreservation(false); | 2855 TestRtpStatePreservation(false); |
2858 } | 2856 } |
2859 | 2857 |
2860 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { | 2858 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3026 const rtc::scoped_ptr<EventWrapper> packet_event_; | 3024 const rtc::scoped_ptr<EventWrapper> packet_event_; |
3027 Call* sender_call_; | 3025 Call* sender_call_; |
3028 Call* receiver_call_; | 3026 Call* receiver_call_; |
3029 NetworkState sender_state_ GUARDED_BY(test_crit_); | 3027 NetworkState sender_state_ GUARDED_BY(test_crit_); |
3030 int sender_rtp_ GUARDED_BY(test_crit_); | 3028 int sender_rtp_ GUARDED_BY(test_crit_); |
3031 int sender_rtcp_ GUARDED_BY(test_crit_); | 3029 int sender_rtcp_ GUARDED_BY(test_crit_); |
3032 int receiver_rtcp_ GUARDED_BY(test_crit_); | 3030 int receiver_rtcp_ GUARDED_BY(test_crit_); |
3033 int down_frames_ GUARDED_BY(test_crit_); | 3031 int down_frames_ GUARDED_BY(test_crit_); |
3034 } test; | 3032 } test; |
3035 | 3033 |
3036 RunBaseTest(&test); | 3034 RunBaseTest(&test, FakeNetworkPipe::Config()); |
3037 } | 3035 } |
3038 | 3036 |
3039 TEST_F(EndToEndTest, CallReportsRttForSender) { | 3037 TEST_F(EndToEndTest, CallReportsRttForSender) { |
3040 static const int kSendDelayMs = 30; | 3038 static const int kSendDelayMs = 30; |
3041 static const int kReceiveDelayMs = 70; | 3039 static const int kReceiveDelayMs = 70; |
3042 | 3040 |
3043 CreateCalls(Call::Config(), Call::Config()); | 3041 CreateCalls(Call::Config(), Call::Config()); |
3044 | 3042 |
3045 FakeNetworkPipe::Config config; | 3043 FakeNetworkPipe::Config config; |
3046 config.queue_delay_ms = kSendDelayMs; | 3044 config.queue_delay_ms = kSendDelayMs; |
3047 test::DirectTransport sender_transport(config); | 3045 test::DirectTransport sender_transport(config, sender_call_.get()); |
3048 config.queue_delay_ms = kReceiveDelayMs; | 3046 config.queue_delay_ms = kReceiveDelayMs; |
3049 test::DirectTransport receiver_transport(config); | 3047 test::DirectTransport receiver_transport(config, receiver_call_.get()); |
3050 sender_transport.SetReceiver(receiver_call_->Receiver()); | 3048 sender_transport.SetReceiver(receiver_call_->Receiver()); |
3051 receiver_transport.SetReceiver(sender_call_->Receiver()); | 3049 receiver_transport.SetReceiver(sender_call_->Receiver()); |
3052 | 3050 |
3053 CreateSendConfig(1, &sender_transport); | 3051 CreateSendConfig(1, &sender_transport); |
3054 CreateMatchingReceiveConfigs(&receiver_transport); | 3052 CreateMatchingReceiveConfigs(&receiver_transport); |
3055 | 3053 |
3056 CreateStreams(); | 3054 CreateStreams(); |
3057 CreateFrameGeneratorCapturer(); | 3055 CreateFrameGeneratorCapturer(); |
3058 Start(); | 3056 Start(); |
3059 | 3057 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3101 SleepMs(kSilenceTimeoutMs); | 3099 SleepMs(kSilenceTimeoutMs); |
3102 Stop(); | 3100 Stop(); |
3103 | 3101 |
3104 DestroyStreams(); | 3102 DestroyStreams(); |
3105 } | 3103 } |
3106 | 3104 |
3107 TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { | 3105 TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { |
3108 CreateCalls(Call::Config(), Call::Config()); | 3106 CreateCalls(Call::Config(), Call::Config()); |
3109 receiver_call_->SignalNetworkState(kNetworkDown); | 3107 receiver_call_->SignalNetworkState(kNetworkDown); |
3110 | 3108 |
3111 test::DirectTransport sender_transport; | 3109 test::DirectTransport sender_transport(sender_call_.get()); |
3112 sender_transport.SetReceiver(receiver_call_->Receiver()); | 3110 sender_transport.SetReceiver(receiver_call_->Receiver()); |
3113 CreateSendConfig(1, &sender_transport); | 3111 CreateSendConfig(1, &sender_transport); |
3114 UnusedTransport transport; | 3112 UnusedTransport transport; |
3115 CreateMatchingReceiveConfigs(&transport); | 3113 CreateMatchingReceiveConfigs(&transport); |
3116 CreateStreams(); | 3114 CreateStreams(); |
3117 CreateFrameGeneratorCapturer(); | 3115 CreateFrameGeneratorCapturer(); |
3118 | 3116 |
3119 Start(); | 3117 Start(); |
3120 SleepMs(kSilenceTimeoutMs); | 3118 SleepMs(kSilenceTimeoutMs); |
3121 Stop(); | 3119 Stop(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3164 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) | 3162 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) |
3165 << "Enabling RTX requires rtpmap: rtx negotiation."; | 3163 << "Enabling RTX requires rtpmap: rtx negotiation."; |
3166 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) | 3164 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) |
3167 << "Enabling RTP extensions require negotiation."; | 3165 << "Enabling RTP extensions require negotiation."; |
3168 | 3166 |
3169 VerifyEmptyNackConfig(default_receive_config.rtp.nack); | 3167 VerifyEmptyNackConfig(default_receive_config.rtp.nack); |
3170 VerifyEmptyFecConfig(default_receive_config.rtp.fec); | 3168 VerifyEmptyFecConfig(default_receive_config.rtp.fec); |
3171 } | 3169 } |
3172 | 3170 |
3173 } // namespace webrtc | 3171 } // namespace webrtc |
OLD | NEW |