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 13 matching lines...) Expand all Loading... |
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
25 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" | 25 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" |
26 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" | 26 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" |
27 #include "webrtc/modules/video_coding/include/video_coding_defines.h" | 27 #include "webrtc/modules/video_coding/include/video_coding_defines.h" |
28 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 28 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
29 #include "webrtc/system_wrappers/include/metrics.h" | 29 #include "webrtc/system_wrappers/include/metrics.h" |
30 #include "webrtc/system_wrappers/include/sleep.h" | 30 #include "webrtc/system_wrappers/include/sleep.h" |
31 #include "webrtc/test/call_test.h" | 31 #include "webrtc/test/call_test.h" |
32 #include "webrtc/test/direct_transport.h" | 32 #include "webrtc/test/direct_transport.h" |
33 #include "webrtc/test/encoder_settings.h" | 33 #include "webrtc/test/encoder_settings.h" |
34 #include "webrtc/test/fake_audio_device.h" | |
35 #include "webrtc/test/fake_decoder.h" | 34 #include "webrtc/test/fake_decoder.h" |
36 #include "webrtc/test/fake_encoder.h" | 35 #include "webrtc/test/fake_encoder.h" |
37 #include "webrtc/test/frame_generator.h" | 36 #include "webrtc/test/frame_generator.h" |
38 #include "webrtc/test/frame_generator_capturer.h" | 37 #include "webrtc/test/frame_generator_capturer.h" |
39 #include "webrtc/test/histogram.h" | 38 #include "webrtc/test/histogram.h" |
40 #include "webrtc/test/null_transport.h" | 39 #include "webrtc/test/null_transport.h" |
41 #include "webrtc/test/rtcp_packet_parser.h" | 40 #include "webrtc/test/rtcp_packet_parser.h" |
42 #include "webrtc/test/rtp_rtcp_observer.h" | 41 #include "webrtc/test/rtp_rtcp_observer.h" |
43 #include "webrtc/test/testsupport/fileutils.h" | 42 #include "webrtc/test/testsupport/fileutils.h" |
44 #include "webrtc/test/testsupport/perf_test.h" | 43 #include "webrtc/test/testsupport/perf_test.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); | 78 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); |
80 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); | 79 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); |
81 void TestRtpStatePreservation(bool use_rtx); | 80 void TestRtpStatePreservation(bool use_rtx); |
82 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); | 81 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); |
83 }; | 82 }; |
84 | 83 |
85 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { | 84 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { |
86 CreateCalls(Call::Config(), Call::Config()); | 85 CreateCalls(Call::Config(), Call::Config()); |
87 | 86 |
88 test::NullTransport transport; | 87 test::NullTransport transport; |
89 CreateSendConfig(1, &transport); | 88 CreateSendConfig(1, 0, &transport); |
90 CreateMatchingReceiveConfigs(&transport); | 89 CreateMatchingReceiveConfigs(&transport); |
91 | 90 |
92 CreateStreams(); | 91 CreateVideoStreams(); |
93 | 92 |
94 video_receive_streams_[0]->Start(); | 93 video_receive_streams_[0]->Start(); |
95 video_receive_streams_[0]->Start(); | 94 video_receive_streams_[0]->Start(); |
96 | 95 |
97 DestroyStreams(); | 96 DestroyStreams(); |
98 } | 97 } |
99 | 98 |
100 TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) { | 99 TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) { |
101 CreateCalls(Call::Config(), Call::Config()); | 100 CreateCalls(Call::Config(), Call::Config()); |
102 | 101 |
103 test::NullTransport transport; | 102 test::NullTransport transport; |
104 CreateSendConfig(1, &transport); | 103 CreateSendConfig(1, 0, &transport); |
105 CreateMatchingReceiveConfigs(&transport); | 104 CreateMatchingReceiveConfigs(&transport); |
106 | 105 |
107 CreateStreams(); | 106 CreateVideoStreams(); |
108 | 107 |
109 video_receive_streams_[0]->Stop(); | 108 video_receive_streams_[0]->Stop(); |
110 video_receive_streams_[0]->Stop(); | 109 video_receive_streams_[0]->Stop(); |
111 | 110 |
112 DestroyStreams(); | 111 DestroyStreams(); |
113 } | 112 } |
114 | 113 |
115 TEST_F(EndToEndTest, RendersSingleDelayedFrame) { | 114 TEST_F(EndToEndTest, RendersSingleDelayedFrame) { |
116 static const int kWidth = 320; | 115 static const int kWidth = 320; |
117 static const int kHeight = 240; | 116 static const int kHeight = 240; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 rtc::Event event_; | 150 rtc::Event event_; |
152 }; | 151 }; |
153 | 152 |
154 CreateCalls(Call::Config(), Call::Config()); | 153 CreateCalls(Call::Config(), Call::Config()); |
155 | 154 |
156 test::DirectTransport sender_transport(sender_call_.get()); | 155 test::DirectTransport sender_transport(sender_call_.get()); |
157 test::DirectTransport receiver_transport(receiver_call_.get()); | 156 test::DirectTransport receiver_transport(receiver_call_.get()); |
158 sender_transport.SetReceiver(receiver_call_->Receiver()); | 157 sender_transport.SetReceiver(receiver_call_->Receiver()); |
159 receiver_transport.SetReceiver(sender_call_->Receiver()); | 158 receiver_transport.SetReceiver(sender_call_->Receiver()); |
160 | 159 |
161 CreateSendConfig(1, &sender_transport); | 160 CreateSendConfig(1, 0, &sender_transport); |
162 CreateMatchingReceiveConfigs(&receiver_transport); | 161 CreateMatchingReceiveConfigs(&receiver_transport); |
163 | 162 |
164 TestFrameCallback pre_render_callback; | 163 TestFrameCallback pre_render_callback; |
165 video_receive_configs_[0].pre_render_callback = &pre_render_callback; | 164 video_receive_configs_[0].pre_render_callback = &pre_render_callback; |
166 video_receive_configs_[0].renderer = &renderer; | 165 video_receive_configs_[0].renderer = &renderer; |
167 | 166 |
168 CreateStreams(); | 167 CreateVideoStreams(); |
169 Start(); | 168 Start(); |
170 | 169 |
171 // Create frames that are smaller than the send width/height, this is done to | 170 // Create frames that are smaller than the send width/height, this is done to |
172 // check that the callbacks are done after processing video. | 171 // check that the callbacks are done after processing video. |
173 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 172 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
174 test::FrameGenerator::CreateChromaGenerator(kWidth, kHeight)); | 173 test::FrameGenerator::CreateChromaGenerator(kWidth, kHeight)); |
175 video_send_stream_->Input()->IncomingCapturedFrame( | 174 video_send_stream_->Input()->IncomingCapturedFrame( |
176 *frame_generator->NextFrame()); | 175 *frame_generator->NextFrame()); |
177 EXPECT_TRUE(pre_render_callback.Wait()) | 176 EXPECT_TRUE(pre_render_callback.Wait()) |
178 << "Timed out while waiting for pre-render callback."; | 177 << "Timed out while waiting for pre-render callback."; |
(...skipping 24 matching lines...) Expand all Loading... |
203 rtc::Event event_; | 202 rtc::Event event_; |
204 } renderer; | 203 } renderer; |
205 | 204 |
206 CreateCalls(Call::Config(), Call::Config()); | 205 CreateCalls(Call::Config(), Call::Config()); |
207 | 206 |
208 test::DirectTransport sender_transport(sender_call_.get()); | 207 test::DirectTransport sender_transport(sender_call_.get()); |
209 test::DirectTransport receiver_transport(receiver_call_.get()); | 208 test::DirectTransport receiver_transport(receiver_call_.get()); |
210 sender_transport.SetReceiver(receiver_call_->Receiver()); | 209 sender_transport.SetReceiver(receiver_call_->Receiver()); |
211 receiver_transport.SetReceiver(sender_call_->Receiver()); | 210 receiver_transport.SetReceiver(sender_call_->Receiver()); |
212 | 211 |
213 CreateSendConfig(1, &sender_transport); | 212 CreateSendConfig(1, 0, &sender_transport); |
214 CreateMatchingReceiveConfigs(&receiver_transport); | 213 CreateMatchingReceiveConfigs(&receiver_transport); |
215 video_receive_configs_[0].renderer = &renderer; | 214 video_receive_configs_[0].renderer = &renderer; |
216 | 215 |
217 CreateStreams(); | 216 CreateVideoStreams(); |
218 Start(); | 217 Start(); |
219 | 218 |
220 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 219 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
221 test::FrameGenerator::CreateChromaGenerator( | 220 test::FrameGenerator::CreateChromaGenerator( |
222 video_encoder_config_.streams[0].width, | 221 video_encoder_config_.streams[0].width, |
223 video_encoder_config_.streams[0].height)); | 222 video_encoder_config_.streams[0].height)); |
224 video_send_stream_->Input()->IncomingCapturedFrame( | 223 video_send_stream_->Input()->IncomingCapturedFrame( |
225 *frame_generator->NextFrame()); | 224 *frame_generator->NextFrame()); |
226 | 225 |
227 EXPECT_TRUE(renderer.Wait()) | 226 EXPECT_TRUE(renderer.Wait()) |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 } | 300 } |
302 | 301 |
303 void ModifyVideoConfigs( | 302 void ModifyVideoConfigs( |
304 VideoSendStream::Config* send_config, | 303 VideoSendStream::Config* send_config, |
305 std::vector<VideoReceiveStream::Config>* receive_configs, | 304 std::vector<VideoReceiveStream::Config>* receive_configs, |
306 VideoEncoderConfig* encoder_config) override { | 305 VideoEncoderConfig* encoder_config) override { |
307 send_config->rtp.nack.rtp_history_ms = | 306 send_config->rtp.nack.rtp_history_ms = |
308 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 307 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
309 send_config->encoder_settings.encoder = &fake_encoder_; | 308 send_config->encoder_settings.encoder = &fake_encoder_; |
310 send_config->encoder_settings.payload_name = "H264"; | 309 send_config->encoder_settings.payload_name = "H264"; |
311 send_config->encoder_settings.payload_type = kFakeSendPayloadType; | 310 send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType; |
312 encoder_config->streams[0].min_bitrate_bps = 50000; | 311 encoder_config->streams[0].min_bitrate_bps = 50000; |
313 encoder_config->streams[0].target_bitrate_bps = | 312 encoder_config->streams[0].target_bitrate_bps = |
314 encoder_config->streams[0].max_bitrate_bps = 2000000; | 313 encoder_config->streams[0].max_bitrate_bps = 2000000; |
315 | 314 |
316 (*receive_configs)[0].renderer = this; | 315 (*receive_configs)[0].renderer = this; |
317 (*receive_configs)[0].decoders.resize(1); | 316 (*receive_configs)[0].decoders.resize(1); |
318 (*receive_configs)[0].decoders[0].payload_type = | 317 (*receive_configs)[0].decoders[0].payload_type = |
319 send_config->encoder_settings.payload_type; | 318 send_config->encoder_settings.payload_type; |
320 (*receive_configs)[0].decoders[0].payload_name = | 319 (*receive_configs)[0].decoders[0].payload_name = |
321 send_config->encoder_settings.payload_name; | 320 send_config->encoder_settings.payload_name; |
(...skipping 24 matching lines...) Expand all Loading... |
346 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {} | 345 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {} |
347 | 346 |
348 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 347 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
349 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 348 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
350 EXPECT_TRUE(parser.IsValid()); | 349 EXPECT_TRUE(parser.IsValid()); |
351 uint32_t ssrc = 0; | 350 uint32_t ssrc = 0; |
352 ssrc |= static_cast<uint32_t>(packet[4]) << 24; | 351 ssrc |= static_cast<uint32_t>(packet[4]) << 24; |
353 ssrc |= static_cast<uint32_t>(packet[5]) << 16; | 352 ssrc |= static_cast<uint32_t>(packet[5]) << 16; |
354 ssrc |= static_cast<uint32_t>(packet[6]) << 8; | 353 ssrc |= static_cast<uint32_t>(packet[6]) << 8; |
355 ssrc |= static_cast<uint32_t>(packet[7]) << 0; | 354 ssrc |= static_cast<uint32_t>(packet[7]) << 0; |
356 EXPECT_EQ(kReceiverLocalSsrc, ssrc); | 355 EXPECT_EQ(kReceiverLocalVideoSsrc, ssrc); |
357 observation_complete_.Set(); | 356 observation_complete_.Set(); |
358 | 357 |
359 return SEND_PACKET; | 358 return SEND_PACKET; |
360 } | 359 } |
361 | 360 |
362 void PerformTest() override { | 361 void PerformTest() override { |
363 EXPECT_TRUE(Wait()) | 362 EXPECT_TRUE(Wait()) |
364 << "Timed out while waiting for a receiver RTCP packet to be sent."; | 363 << "Timed out while waiting for a receiver RTCP packet to be sent."; |
365 } | 364 } |
366 } test; | 365 } test; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 private: | 466 private: |
468 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 467 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
469 rtc::CritScope lock(&crit_); | 468 rtc::CritScope lock(&crit_); |
470 RTPHeader header; | 469 RTPHeader header; |
471 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 470 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
472 | 471 |
473 int encapsulated_payload_type = -1; | 472 int encapsulated_payload_type = -1; |
474 if (header.payloadType == kRedPayloadType) { | 473 if (header.payloadType == kRedPayloadType) { |
475 encapsulated_payload_type = | 474 encapsulated_payload_type = |
476 static_cast<int>(packet[header.headerLength]); | 475 static_cast<int>(packet[header.headerLength]); |
477 if (encapsulated_payload_type != kFakeSendPayloadType) | 476 if (encapsulated_payload_type != kFakeVideoSendPayloadType) |
478 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); | 477 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |
479 } else { | 478 } else { |
480 EXPECT_EQ(kFakeSendPayloadType, header.payloadType); | 479 EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType); |
481 } | 480 } |
482 | 481 |
483 if (protected_sequence_numbers_.count(header.sequenceNumber) != 0) { | 482 if (protected_sequence_numbers_.count(header.sequenceNumber) != 0) { |
484 // Retransmitted packet, should not count. | 483 // Retransmitted packet, should not count. |
485 protected_sequence_numbers_.erase(header.sequenceNumber); | 484 protected_sequence_numbers_.erase(header.sequenceNumber); |
486 EXPECT_GT(protected_timestamps_.count(header.timestamp), 0u); | 485 EXPECT_GT(protected_timestamps_.count(header.timestamp), 0u); |
487 protected_timestamps_.erase(header.timestamp); | 486 protected_timestamps_.erase(header.timestamp); |
488 return SEND_PACKET; | 487 return SEND_PACKET; |
489 } | 488 } |
490 | 489 |
491 switch (state_) { | 490 switch (state_) { |
492 case kFirstPacket: | 491 case kFirstPacket: |
493 state_ = kDropEveryOtherPacketUntilFec; | 492 state_ = kDropEveryOtherPacketUntilFec; |
494 break; | 493 break; |
495 case kDropEveryOtherPacketUntilFec: | 494 case kDropEveryOtherPacketUntilFec: |
496 if (encapsulated_payload_type == kUlpfecPayloadType) { | 495 if (encapsulated_payload_type == kUlpfecPayloadType) { |
497 state_ = kDropNextMediaPacket; | 496 state_ = kDropNextMediaPacket; |
498 return SEND_PACKET; | 497 return SEND_PACKET; |
499 } | 498 } |
500 if (header.sequenceNumber % 2 == 0) | 499 if (header.sequenceNumber % 2 == 0) |
501 return DROP_PACKET; | 500 return DROP_PACKET; |
502 break; | 501 break; |
503 case kDropNextMediaPacket: | 502 case kDropNextMediaPacket: |
504 if (encapsulated_payload_type == kFakeSendPayloadType) { | 503 if (encapsulated_payload_type == kFakeVideoSendPayloadType) { |
505 protected_sequence_numbers_.insert(header.sequenceNumber); | 504 protected_sequence_numbers_.insert(header.sequenceNumber); |
506 protected_timestamps_.insert(header.timestamp); | 505 protected_timestamps_.insert(header.timestamp); |
507 state_ = kDropEveryOtherPacketUntilFec; | 506 state_ = kDropEveryOtherPacketUntilFec; |
508 return DROP_PACKET; | 507 return DROP_PACKET; |
509 } | 508 } |
510 break; | 509 break; |
511 } | 510 } |
512 | 511 |
513 return SEND_PACKET; | 512 return SEND_PACKET; |
514 } | 513 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 private: | 572 private: |
574 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 573 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
575 rtc::CritScope lock_(&crit_); | 574 rtc::CritScope lock_(&crit_); |
576 RTPHeader header; | 575 RTPHeader header; |
577 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 576 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
578 | 577 |
579 int encapsulated_payload_type = -1; | 578 int encapsulated_payload_type = -1; |
580 if (header.payloadType == kRedPayloadType) { | 579 if (header.payloadType == kRedPayloadType) { |
581 encapsulated_payload_type = | 580 encapsulated_payload_type = |
582 static_cast<int>(packet[header.headerLength]); | 581 static_cast<int>(packet[header.headerLength]); |
583 if (encapsulated_payload_type != kFakeSendPayloadType) | 582 if (encapsulated_payload_type != kFakeVideoSendPayloadType) |
584 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); | 583 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |
585 } else { | 584 } else { |
586 EXPECT_EQ(kFakeSendPayloadType, header.payloadType); | 585 EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType); |
587 } | 586 } |
588 | 587 |
589 if (has_last_sequence_number_ && | 588 if (has_last_sequence_number_ && |
590 !IsNewerSequenceNumber(header.sequenceNumber, | 589 !IsNewerSequenceNumber(header.sequenceNumber, |
591 last_sequence_number_)) { | 590 last_sequence_number_)) { |
592 // Drop retransmitted packets. | 591 // Drop retransmitted packets. |
593 return DROP_PACKET; | 592 return DROP_PACKET; |
594 } | 593 } |
595 last_sequence_number_ = header.sequenceNumber; | 594 last_sequence_number_ = header.sequenceNumber; |
596 has_last_sequence_number_ = true; | 595 has_last_sequence_number_ = true; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { | 690 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { |
692 // Must be set high enough to allow the bitrate probing to finish. | 691 // Must be set high enough to allow the bitrate probing to finish. |
693 static const int kMinProbePackets = 30; | 692 static const int kMinProbePackets = 30; |
694 static const int kDroppedFrameNumber = kMinProbePackets + 1; | 693 static const int kDroppedFrameNumber = kMinProbePackets + 1; |
695 class RetransmissionObserver : public test::EndToEndTest, | 694 class RetransmissionObserver : public test::EndToEndTest, |
696 public I420FrameCallback { | 695 public I420FrameCallback { |
697 public: | 696 public: |
698 explicit RetransmissionObserver(bool use_rtx, bool use_red) | 697 explicit RetransmissionObserver(bool use_rtx, bool use_red) |
699 : EndToEndTest(kDefaultTimeoutMs), | 698 : EndToEndTest(kDefaultTimeoutMs), |
700 payload_type_(GetPayloadType(false, use_red)), | 699 payload_type_(GetPayloadType(false, use_red)), |
701 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]), | 700 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kVideoSendSsrcs[0]), |
702 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), | 701 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), |
703 marker_bits_observed_(0), | 702 marker_bits_observed_(0), |
704 num_packets_observed_(0), | 703 num_packets_observed_(0), |
705 retransmitted_timestamp_(0), | 704 retransmitted_timestamp_(0), |
706 frame_retransmitted_(false) {} | 705 frame_retransmitted_(false) {} |
707 | 706 |
708 private: | 707 private: |
709 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 708 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
710 rtc::CritScope lock(&crit_); | 709 rtc::CritScope lock(&crit_); |
711 RTPHeader header; | 710 RTPHeader header; |
712 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 711 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
713 | 712 |
714 // We accept some padding or RTX packets in the beginning to enable | 713 // We accept some padding or RTX packets in the beginning to enable |
715 // bitrate probing. | 714 // bitrate probing. |
716 if (num_packets_observed_++ < kMinProbePackets && | 715 if (num_packets_observed_++ < kMinProbePackets && |
717 header.payloadType != payload_type_) { | 716 header.payloadType != payload_type_) { |
718 EXPECT_TRUE(retransmission_payload_type_ == header.payloadType || | 717 EXPECT_TRUE(retransmission_payload_type_ == header.payloadType || |
719 length == header.headerLength + header.paddingLength); | 718 length == header.headerLength + header.paddingLength); |
720 return SEND_PACKET; | 719 return SEND_PACKET; |
721 } | 720 } |
722 if (header.timestamp == retransmitted_timestamp_) { | 721 if (header.timestamp == retransmitted_timestamp_) { |
723 EXPECT_EQ(retransmission_ssrc_, header.ssrc); | 722 EXPECT_EQ(retransmission_ssrc_, header.ssrc); |
724 EXPECT_EQ(retransmission_payload_type_, header.payloadType); | 723 EXPECT_EQ(retransmission_payload_type_, header.payloadType); |
725 frame_retransmitted_ = true; | 724 frame_retransmitted_ = true; |
726 return SEND_PACKET; | 725 return SEND_PACKET; |
727 } | 726 } |
728 | 727 |
729 EXPECT_EQ(kSendSsrcs[0], header.ssrc); | 728 EXPECT_EQ(kVideoSendSsrcs[0], header.ssrc); |
730 EXPECT_EQ(payload_type_, header.payloadType); | 729 EXPECT_EQ(payload_type_, header.payloadType); |
731 | 730 |
732 // Found the final packet of the frame to inflict loss to, drop this and | 731 // Found the final packet of the frame to inflict loss to, drop this and |
733 // expect a retransmission. | 732 // expect a retransmission. |
734 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) { | 733 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) { |
735 retransmitted_timestamp_ = header.timestamp; | 734 retransmitted_timestamp_ = header.timestamp; |
736 return DROP_PACKET; | 735 return DROP_PACKET; |
737 } | 736 } |
738 | 737 |
739 return SEND_PACKET; | 738 return SEND_PACKET; |
(...skipping 18 matching lines...) Expand all Loading... |
758 if (payload_type_ == kRedPayloadType) { | 757 if (payload_type_ == kRedPayloadType) { |
759 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 758 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
760 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 759 send_config->rtp.fec.red_payload_type = kRedPayloadType; |
761 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 760 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
762 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 761 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
763 } | 762 } |
764 | 763 |
765 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { | 764 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { |
766 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | 765 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
767 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 766 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
768 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].ssrc = | 767 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc = |
769 kSendRtxSsrcs[0]; | 768 kSendRtxSsrcs[0]; |
770 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = | 769 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type = |
771 kSendRtxPayloadType; | 770 kSendRtxPayloadType; |
772 } | 771 } |
773 } | 772 } |
774 | 773 |
775 void PerformTest() override { | 774 void PerformTest() override { |
776 EXPECT_TRUE(Wait()) | 775 EXPECT_TRUE(Wait()) |
777 << "Timed out while waiting for retransmission to render."; | 776 << "Timed out while waiting for retransmission to render."; |
778 } | 777 } |
779 | 778 |
780 int GetPayloadType(bool use_rtx, bool use_red) { | 779 int GetPayloadType(bool use_rtx, bool use_red) { |
781 return use_rtx ? kSendRtxPayloadType | 780 return use_rtx ? kSendRtxPayloadType |
782 : (use_red ? kRedPayloadType : kFakeSendPayloadType); | 781 : (use_red ? kRedPayloadType : kFakeVideoSendPayloadType); |
783 } | 782 } |
784 | 783 |
785 rtc::CriticalSection crit_; | 784 rtc::CriticalSection crit_; |
786 const int payload_type_; | 785 const int payload_type_; |
787 const uint32_t retransmission_ssrc_; | 786 const uint32_t retransmission_ssrc_; |
788 const int retransmission_payload_type_; | 787 const int retransmission_payload_type_; |
789 int marker_bits_observed_; | 788 int marker_bits_observed_; |
790 int num_packets_observed_; | 789 int num_packets_observed_; |
791 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); | 790 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); |
792 bool frame_retransmitted_; | 791 bool frame_retransmitted_; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255. | 868 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255. |
870 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0. | 869 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0. |
871 | 870 |
872 CreateCalls(Call::Config(), Call::Config()); | 871 CreateCalls(Call::Config(), Call::Config()); |
873 | 872 |
874 test::DirectTransport sender_transport(sender_call_.get()); | 873 test::DirectTransport sender_transport(sender_call_.get()); |
875 test::DirectTransport receiver_transport(receiver_call_.get()); | 874 test::DirectTransport receiver_transport(receiver_call_.get()); |
876 sender_transport.SetReceiver(receiver_call_->Receiver()); | 875 sender_transport.SetReceiver(receiver_call_->Receiver()); |
877 receiver_transport.SetReceiver(sender_call_->Receiver()); | 876 receiver_transport.SetReceiver(sender_call_->Receiver()); |
878 | 877 |
879 CreateSendConfig(1, &sender_transport); | 878 CreateSendConfig(1, 0, &sender_transport); |
880 rtc::scoped_ptr<VideoEncoder> encoder( | 879 rtc::scoped_ptr<VideoEncoder> encoder( |
881 VideoEncoder::Create(VideoEncoder::kVp8)); | 880 VideoEncoder::Create(VideoEncoder::kVp8)); |
882 video_send_config_.encoder_settings.encoder = encoder.get(); | 881 video_send_config_.encoder_settings.encoder = encoder.get(); |
883 video_send_config_.encoder_settings.payload_name = "VP8"; | 882 video_send_config_.encoder_settings.payload_name = "VP8"; |
884 ASSERT_EQ(1u, video_encoder_config_.streams.size()) << "Test setup error."; | 883 ASSERT_EQ(1u, video_encoder_config_.streams.size()) << "Test setup error."; |
885 video_encoder_config_.streams[0].width = kWidth; | 884 video_encoder_config_.streams[0].width = kWidth; |
886 video_encoder_config_.streams[0].height = kHeight; | 885 video_encoder_config_.streams[0].height = kHeight; |
887 video_send_config_.pre_encode_callback = &pre_encode_callback; | 886 video_send_config_.pre_encode_callback = &pre_encode_callback; |
888 | 887 |
889 CreateMatchingReceiveConfigs(&receiver_transport); | 888 CreateMatchingReceiveConfigs(&receiver_transport); |
890 video_receive_configs_[0].pre_render_callback = &pre_render_callback; | 889 video_receive_configs_[0].pre_render_callback = &pre_render_callback; |
891 video_receive_configs_[0].renderer = &renderer; | 890 video_receive_configs_[0].renderer = &renderer; |
892 | 891 |
893 CreateStreams(); | 892 CreateVideoStreams(); |
894 Start(); | 893 Start(); |
895 | 894 |
896 // Create frames that are smaller than the send width/height, this is done to | 895 // Create frames that are smaller than the send width/height, this is done to |
897 // check that the callbacks are done after processing video. | 896 // check that the callbacks are done after processing video. |
898 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 897 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
899 test::FrameGenerator::CreateChromaGenerator(kWidth / 2, kHeight / 2)); | 898 test::FrameGenerator::CreateChromaGenerator(kWidth / 2, kHeight / 2)); |
900 video_send_stream_->Input()->IncomingCapturedFrame( | 899 video_send_stream_->Input()->IncomingCapturedFrame( |
901 *frame_generator->NextFrame()); | 900 *frame_generator->NextFrame()); |
902 | 901 |
903 EXPECT_TRUE(pre_encode_callback.Wait()) | 902 EXPECT_TRUE(pre_encode_callback.Wait()) |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 }; | 1042 }; |
1044 | 1043 |
1045 CreateCalls(Call::Config(), Call::Config()); | 1044 CreateCalls(Call::Config(), Call::Config()); |
1046 | 1045 |
1047 test::DirectTransport send_transport(sender_call_.get()); | 1046 test::DirectTransport send_transport(sender_call_.get()); |
1048 test::DirectTransport receive_transport(receiver_call_.get()); | 1047 test::DirectTransport receive_transport(receiver_call_.get()); |
1049 PacketInputObserver input_observer(receiver_call_->Receiver()); | 1048 PacketInputObserver input_observer(receiver_call_->Receiver()); |
1050 send_transport.SetReceiver(&input_observer); | 1049 send_transport.SetReceiver(&input_observer); |
1051 receive_transport.SetReceiver(sender_call_->Receiver()); | 1050 receive_transport.SetReceiver(sender_call_->Receiver()); |
1052 | 1051 |
1053 CreateSendConfig(1, &send_transport); | 1052 CreateSendConfig(1, 0, &send_transport); |
1054 CreateMatchingReceiveConfigs(&receive_transport); | 1053 CreateMatchingReceiveConfigs(&receive_transport); |
1055 | 1054 |
1056 CreateStreams(); | 1055 CreateVideoStreams(); |
1057 CreateFrameGeneratorCapturer(); | 1056 CreateFrameGeneratorCapturer(); |
1058 Start(); | 1057 Start(); |
1059 | 1058 |
1060 receiver_call_->DestroyVideoReceiveStream(video_receive_streams_[0]); | 1059 receiver_call_->DestroyVideoReceiveStream(video_receive_streams_[0]); |
1061 video_receive_streams_.clear(); | 1060 video_receive_streams_.clear(); |
1062 | 1061 |
1063 // Wait() waits for a received packet. | 1062 // Wait() waits for a received packet. |
1064 EXPECT_TRUE(input_observer.Wait()); | 1063 EXPECT_TRUE(input_observer.Wait()); |
1065 | 1064 |
1066 Stop(); | 1065 Stop(); |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 stream->max_bitrate_bps = 100000; | 1219 stream->max_bitrate_bps = 100000; |
1221 | 1220 |
1222 UpdateSendConfig(i, &send_config, &encoder_config, &frame_generators[i]); | 1221 UpdateSendConfig(i, &send_config, &encoder_config, &frame_generators[i]); |
1223 | 1222 |
1224 send_streams[i] = | 1223 send_streams[i] = |
1225 sender_call->CreateVideoSendStream(send_config, encoder_config); | 1224 sender_call->CreateVideoSendStream(send_config, encoder_config); |
1226 send_streams[i]->Start(); | 1225 send_streams[i]->Start(); |
1227 | 1226 |
1228 VideoReceiveStream::Config receive_config(receiver_transport.get()); | 1227 VideoReceiveStream::Config receive_config(receiver_transport.get()); |
1229 receive_config.rtp.remote_ssrc = ssrc; | 1228 receive_config.rtp.remote_ssrc = ssrc; |
1230 receive_config.rtp.local_ssrc = test::CallTest::kReceiverLocalSsrc; | 1229 receive_config.rtp.local_ssrc = test::CallTest::kReceiverLocalVideoSsrc; |
1231 VideoReceiveStream::Decoder decoder = | 1230 VideoReceiveStream::Decoder decoder = |
1232 test::CreateMatchingDecoder(send_config.encoder_settings); | 1231 test::CreateMatchingDecoder(send_config.encoder_settings); |
1233 allocated_decoders.push_back(decoder.decoder); | 1232 allocated_decoders.push_back(decoder.decoder); |
1234 receive_config.decoders.push_back(decoder); | 1233 receive_config.decoders.push_back(decoder); |
1235 | 1234 |
1236 UpdateReceiveConfig(i, &receive_config); | 1235 UpdateReceiveConfig(i, &receive_config); |
1237 | 1236 |
1238 receive_streams[i] = | 1237 receive_streams[i] = |
1239 receiver_call->CreateVideoReceiveStream(receive_config); | 1238 receiver_call->CreateVideoReceiveStream(receive_config); |
1240 receive_streams[i]->Start(); | 1239 receive_streams[i]->Start(); |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1652 EncodedFrameTestObserver post_encode_observer; | 1651 EncodedFrameTestObserver post_encode_observer; |
1653 EncodedFrameTestObserver pre_decode_observer; | 1652 EncodedFrameTestObserver pre_decode_observer; |
1654 | 1653 |
1655 CreateCalls(Call::Config(), Call::Config()); | 1654 CreateCalls(Call::Config(), Call::Config()); |
1656 | 1655 |
1657 test::DirectTransport sender_transport(sender_call_.get()); | 1656 test::DirectTransport sender_transport(sender_call_.get()); |
1658 test::DirectTransport receiver_transport(receiver_call_.get()); | 1657 test::DirectTransport receiver_transport(receiver_call_.get()); |
1659 sender_transport.SetReceiver(receiver_call_->Receiver()); | 1658 sender_transport.SetReceiver(receiver_call_->Receiver()); |
1660 receiver_transport.SetReceiver(sender_call_->Receiver()); | 1659 receiver_transport.SetReceiver(sender_call_->Receiver()); |
1661 | 1660 |
1662 CreateSendConfig(1, &sender_transport); | 1661 CreateSendConfig(1, 0, &sender_transport); |
1663 CreateMatchingReceiveConfigs(&receiver_transport); | 1662 CreateMatchingReceiveConfigs(&receiver_transport); |
1664 video_send_config_.post_encode_callback = &post_encode_observer; | 1663 video_send_config_.post_encode_callback = &post_encode_observer; |
1665 video_receive_configs_[0].pre_decode_callback = &pre_decode_observer; | 1664 video_receive_configs_[0].pre_decode_callback = &pre_decode_observer; |
1666 | 1665 |
1667 CreateStreams(); | 1666 CreateVideoStreams(); |
1668 Start(); | 1667 Start(); |
1669 | 1668 |
1670 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 1669 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
1671 test::FrameGenerator::CreateChromaGenerator( | 1670 test::FrameGenerator::CreateChromaGenerator( |
1672 video_encoder_config_.streams[0].width, | 1671 video_encoder_config_.streams[0].width, |
1673 video_encoder_config_.streams[0].height)); | 1672 video_encoder_config_.streams[0].height)); |
1674 video_send_stream_->Input()->IncomingCapturedFrame( | 1673 video_send_stream_->Input()->IncomingCapturedFrame( |
1675 *frame_generator->NextFrame()); | 1674 *frame_generator->NextFrame()); |
1676 | 1675 |
1677 EXPECT_TRUE(post_encode_observer.Wait()) | 1676 EXPECT_TRUE(post_encode_observer.Wait()) |
(...skipping 20 matching lines...) Expand all Loading... |
1698 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 1697 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
1699 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 1698 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
1700 EXPECT_TRUE(parser.IsValid()); | 1699 EXPECT_TRUE(parser.IsValid()); |
1701 | 1700 |
1702 bool received_psfb = false; | 1701 bool received_psfb = false; |
1703 bool received_remb = false; | 1702 bool received_remb = false; |
1704 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); | 1703 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); |
1705 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { | 1704 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { |
1706 if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRemb) { | 1705 if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRemb) { |
1707 const RTCPUtility::RTCPPacket& packet = parser.Packet(); | 1706 const RTCPUtility::RTCPPacket& packet = parser.Packet(); |
1708 EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc); | 1707 EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalVideoSsrc); |
1709 received_psfb = true; | 1708 received_psfb = true; |
1710 } else if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRembItem) { | 1709 } else if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRembItem) { |
1711 const RTCPUtility::RTCPPacket& packet = parser.Packet(); | 1710 const RTCPUtility::RTCPPacket& packet = parser.Packet(); |
1712 EXPECT_GT(packet.REMBItem.BitRate, 0u); | 1711 EXPECT_GT(packet.REMBItem.BitRate, 0u); |
1713 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u); | 1712 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u); |
1714 EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrcs[0]); | 1713 EXPECT_EQ(packet.REMBItem.SSRCs[0], kVideoSendSsrcs[0]); |
1715 received_remb = true; | 1714 received_remb = true; |
1716 } | 1715 } |
1717 packet_type = parser.Iterate(); | 1716 packet_type = parser.Iterate(); |
1718 } | 1717 } |
1719 if (received_psfb && received_remb) | 1718 if (received_psfb && received_remb) |
1720 observation_complete_.Set(); | 1719 observation_complete_.Set(); |
1721 return SEND_PACKET; | 1720 return SEND_PACKET; |
1722 } | 1721 } |
1723 void PerformTest() override { | 1722 void PerformTest() override { |
1724 EXPECT_TRUE(Wait()) << "Timed out while waiting for a " | 1723 EXPECT_TRUE(Wait()) << "Timed out while waiting for a " |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1818 stats.substreams.begin(); it != stats.substreams.end(); ++it) { | 1817 stats.substreams.begin(); it != stats.substreams.end(); ++it) { |
1819 const VideoSendStream::StreamStats& stream_stats = it->second; | 1818 const VideoSendStream::StreamStats& stream_stats = it->second; |
1820 send_stream_nack_packets += | 1819 send_stream_nack_packets += |
1821 stream_stats.rtcp_packet_type_counts.nack_packets; | 1820 stream_stats.rtcp_packet_type_counts.nack_packets; |
1822 } | 1821 } |
1823 for (size_t i = 0; i < receive_streams_.size(); ++i) { | 1822 for (size_t i = 0; i < receive_streams_.size(); ++i) { |
1824 VideoReceiveStream::Stats stats = receive_streams_[i]->GetStats(); | 1823 VideoReceiveStream::Stats stats = receive_streams_[i]->GetStats(); |
1825 receive_stream_nack_packets += | 1824 receive_stream_nack_packets += |
1826 stats.rtcp_packet_type_counts.nack_packets; | 1825 stats.rtcp_packet_type_counts.nack_packets; |
1827 } | 1826 } |
1828 if (send_stream_nack_packets >= 1 && | 1827 if (send_stream_nack_packets >= 1 && receive_stream_nack_packets >= 1) { |
1829 receive_stream_nack_packets >= 1) { | |
1830 // NACK packet sent on receive stream and received on sent stream. | 1828 // NACK packet sent on receive stream and received on sent stream. |
1831 if (MinMetricRunTimePassed()) | 1829 if (MinMetricRunTimePassed()) |
1832 observation_complete_.Set(); | 1830 observation_complete_.Set(); |
1833 } | 1831 } |
1834 } | 1832 } |
1835 | 1833 |
1836 bool MinMetricRunTimePassed() { | 1834 bool MinMetricRunTimePassed() { |
1837 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); | 1835 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); |
1838 if (start_runtime_ms_ == -1) { | 1836 if (start_runtime_ms_ == -1) { |
1839 start_runtime_ms_ = now; | 1837 start_runtime_ms_ = now; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1933 if (use_red_) { | 1931 if (use_red_) { |
1934 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 1932 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
1935 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 1933 send_config->rtp.fec.red_payload_type = kRedPayloadType; |
1936 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 1934 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
1937 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 1935 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
1938 } | 1936 } |
1939 // RTX | 1937 // RTX |
1940 if (use_rtx_) { | 1938 if (use_rtx_) { |
1941 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | 1939 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
1942 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 1940 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
1943 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].ssrc = | 1941 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc = |
1944 kSendRtxSsrcs[0]; | 1942 kSendRtxSsrcs[0]; |
1945 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = | 1943 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type = |
1946 kSendRtxPayloadType; | 1944 kSendRtxPayloadType; |
1947 } | 1945 } |
1948 encoder_config->content_type = | 1946 encoder_config->content_type = |
1949 screenshare_ ? VideoEncoderConfig::ContentType::kScreen | 1947 screenshare_ ? VideoEncoderConfig::ContentType::kScreen |
1950 : VideoEncoderConfig::ContentType::kRealtimeVideo; | 1948 : VideoEncoderConfig::ContentType::kRealtimeVideo; |
1951 } | 1949 } |
1952 | 1950 |
1953 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 1951 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
1954 sender_call_ = sender_call; | 1952 sender_call_ = sender_call; |
1955 receiver_call_ = receiver_call; | 1953 receiver_call_ = receiver_call; |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2229 observation_complete_.Set(); | 2227 observation_complete_.Set(); |
2230 } | 2228 } |
2231 } | 2229 } |
2232 | 2230 |
2233 if (ssrcs_to_observe_ == 0) | 2231 if (ssrcs_to_observe_ == 0) |
2234 observation_complete_.Set(); | 2232 observation_complete_.Set(); |
2235 | 2233 |
2236 return SEND_PACKET; | 2234 return SEND_PACKET; |
2237 } | 2235 } |
2238 | 2236 |
2239 size_t GetNumStreams() const override { return num_ssrcs_; } | 2237 size_t GetNumVideoStreams() const override { return num_ssrcs_; } |
2240 | 2238 |
2241 void ModifyVideoConfigs( | 2239 void ModifyVideoConfigs( |
2242 VideoSendStream::Config* send_config, | 2240 VideoSendStream::Config* send_config, |
2243 std::vector<VideoReceiveStream::Config>* receive_configs, | 2241 std::vector<VideoReceiveStream::Config>* receive_configs, |
2244 VideoEncoderConfig* encoder_config) override { | 2242 VideoEncoderConfig* encoder_config) override { |
2245 if (num_ssrcs_ > 1) { | 2243 if (num_ssrcs_ > 1) { |
2246 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. | 2244 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. |
2247 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { | 2245 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { |
2248 encoder_config->streams[i].min_bitrate_bps = 10000; | 2246 encoder_config->streams[i].min_bitrate_bps = 10000; |
2249 encoder_config->streams[i].target_bitrate_bps = 15000; | 2247 encoder_config->streams[i].target_bitrate_bps = 15000; |
(...skipping 30 matching lines...) Expand all Loading... |
2280 std::map<uint32_t, bool> is_observed_; | 2278 std::map<uint32_t, bool> is_observed_; |
2281 | 2279 |
2282 const size_t num_ssrcs_; | 2280 const size_t num_ssrcs_; |
2283 const bool send_single_ssrc_first_; | 2281 const bool send_single_ssrc_first_; |
2284 | 2282 |
2285 size_t ssrcs_to_observe_; | 2283 size_t ssrcs_to_observe_; |
2286 bool expect_single_ssrc_; | 2284 bool expect_single_ssrc_; |
2287 | 2285 |
2288 VideoSendStream* send_stream_; | 2286 VideoSendStream* send_stream_; |
2289 VideoEncoderConfig video_encoder_config_all_streams_; | 2287 VideoEncoderConfig video_encoder_config_all_streams_; |
2290 } test(kSendSsrcs, num_ssrcs, send_single_ssrc_first); | 2288 } test(kVideoSendSsrcs, num_ssrcs, send_single_ssrc_first); |
2291 | 2289 |
2292 RunBaseTest(&test, FakeNetworkPipe::Config()); | 2290 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2293 } | 2291 } |
2294 | 2292 |
2295 TEST_F(EndToEndTest, ReportsSetEncoderRates) { | 2293 TEST_F(EndToEndTest, ReportsSetEncoderRates) { |
2296 class EncoderRateStatsTest : public test::EndToEndTest, | 2294 class EncoderRateStatsTest : public test::EndToEndTest, |
2297 public test::FakeEncoder { | 2295 public test::FakeEncoder { |
2298 public: | 2296 public: |
2299 EncoderRateStatsTest() | 2297 EncoderRateStatsTest() |
2300 : EndToEndTest(kDefaultTimeoutMs), | 2298 : EndToEndTest(kDefaultTimeoutMs), |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2436 receive_stats_filled_["CName"] |= !stats.c_name.empty(); | 2434 receive_stats_filled_["CName"] |= !stats.c_name.empty(); |
2437 | 2435 |
2438 receive_stats_filled_["RtcpPacketTypeCount"] |= | 2436 receive_stats_filled_["RtcpPacketTypeCount"] |= |
2439 stats.rtcp_packet_type_counts.fir_packets != 0 || | 2437 stats.rtcp_packet_type_counts.fir_packets != 0 || |
2440 stats.rtcp_packet_type_counts.nack_packets != 0 || | 2438 stats.rtcp_packet_type_counts.nack_packets != 0 || |
2441 stats.rtcp_packet_type_counts.pli_packets != 0 || | 2439 stats.rtcp_packet_type_counts.pli_packets != 0 || |
2442 stats.rtcp_packet_type_counts.nack_requests != 0 || | 2440 stats.rtcp_packet_type_counts.nack_requests != 0 || |
2443 stats.rtcp_packet_type_counts.unique_nack_requests != 0; | 2441 stats.rtcp_packet_type_counts.unique_nack_requests != 0; |
2444 | 2442 |
2445 assert(stats.current_payload_type == -1 || | 2443 assert(stats.current_payload_type == -1 || |
2446 stats.current_payload_type == kFakeSendPayloadType); | 2444 stats.current_payload_type == kFakeVideoSendPayloadType); |
2447 receive_stats_filled_["IncomingPayloadType"] |= | 2445 receive_stats_filled_["IncomingPayloadType"] |= |
2448 stats.current_payload_type == kFakeSendPayloadType; | 2446 stats.current_payload_type == kFakeVideoSendPayloadType; |
2449 } | 2447 } |
2450 | 2448 |
2451 return AllStatsFilled(receive_stats_filled_); | 2449 return AllStatsFilled(receive_stats_filled_); |
2452 } | 2450 } |
2453 | 2451 |
2454 bool CheckSendStats() { | 2452 bool CheckSendStats() { |
2455 RTC_DCHECK(send_stream_ != nullptr); | 2453 RTC_DCHECK(send_stream_ != nullptr); |
2456 VideoSendStream::Stats stats = send_stream_->GetStats(); | 2454 VideoSendStream::Stats stats = send_stream_->GetStats(); |
2457 | 2455 |
2458 send_stats_filled_["NumStreams"] |= | 2456 send_stats_filled_["NumStreams"] |= |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2545 | 2543 |
2546 const std::vector<uint32_t>& ssrcs = send_config->rtp.ssrcs; | 2544 const std::vector<uint32_t>& ssrcs = send_config->rtp.ssrcs; |
2547 for (size_t i = 0; i < ssrcs.size(); ++i) { | 2545 for (size_t i = 0; i < ssrcs.size(); ++i) { |
2548 expected_send_ssrcs_.insert(ssrcs[i]); | 2546 expected_send_ssrcs_.insert(ssrcs[i]); |
2549 expected_receive_ssrcs_.push_back( | 2547 expected_receive_ssrcs_.push_back( |
2550 (*receive_configs)[i].rtp.remote_ssrc); | 2548 (*receive_configs)[i].rtp.remote_ssrc); |
2551 (*receive_configs)[i].render_delay_ms = kExpectedRenderDelayMs; | 2549 (*receive_configs)[i].render_delay_ms = kExpectedRenderDelayMs; |
2552 } | 2550 } |
2553 } | 2551 } |
2554 | 2552 |
2555 size_t GetNumStreams() const override { return kNumSsrcs; } | 2553 size_t GetNumVideoStreams() const override { return kNumSsrcs; } |
2556 | 2554 |
2557 void OnVideoStreamsCreated( | 2555 void OnVideoStreamsCreated( |
2558 VideoSendStream* send_stream, | 2556 VideoSendStream* send_stream, |
2559 const std::vector<VideoReceiveStream*>& receive_streams) override { | 2557 const std::vector<VideoReceiveStream*>& receive_streams) override { |
2560 send_stream_ = send_stream; | 2558 send_stream_ = send_stream; |
2561 receive_streams_ = receive_streams; | 2559 receive_streams_ = receive_streams; |
2562 } | 2560 } |
2563 | 2561 |
2564 void PerformTest() override { | 2562 void PerformTest() override { |
2565 Clock* clock = Clock::GetRealTimeClock(); | 2563 Clock* clock = Clock::GetRealTimeClock(); |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2706 | 2704 |
2707 if (!observed_redundant_retransmission_[header.ssrc]) { | 2705 if (!observed_redundant_retransmission_[header.ssrc]) { |
2708 observed_redundant_retransmission_[header.ssrc] = true; | 2706 observed_redundant_retransmission_[header.ssrc] = true; |
2709 if (--ssrcs_to_observe_ == 0) | 2707 if (--ssrcs_to_observe_ == 0) |
2710 observation_complete_.Set(); | 2708 observation_complete_.Set(); |
2711 } | 2709 } |
2712 | 2710 |
2713 return SEND_PACKET; | 2711 return SEND_PACKET; |
2714 } | 2712 } |
2715 | 2713 |
2716 size_t GetNumStreams() const override { return kNumSsrcs; } | 2714 size_t GetNumVideoStreams() const override { return kNumSsrcs; } |
2717 | 2715 |
2718 void ModifyVideoConfigs( | 2716 void ModifyVideoConfigs( |
2719 VideoSendStream::Config* send_config, | 2717 VideoSendStream::Config* send_config, |
2720 std::vector<VideoReceiveStream::Config>* receive_configs, | 2718 std::vector<VideoReceiveStream::Config>* receive_configs, |
2721 VideoEncoderConfig* encoder_config) override { | 2719 VideoEncoderConfig* encoder_config) override { |
2722 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. | 2720 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. |
2723 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { | 2721 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { |
2724 encoder_config->streams[i].min_bitrate_bps = 10000; | 2722 encoder_config->streams[i].min_bitrate_bps = 10000; |
2725 encoder_config->streams[i].target_bitrate_bps = 15000; | 2723 encoder_config->streams[i].target_bitrate_bps = 15000; |
2726 encoder_config->streams[i].max_bitrate_bps = 20000; | 2724 encoder_config->streams[i].max_bitrate_bps = 20000; |
(...skipping 25 matching lines...) Expand all Loading... |
2752 | 2750 |
2753 void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { | 2751 void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
2754 static const uint32_t kMaxSequenceNumberGap = 100; | 2752 static const uint32_t kMaxSequenceNumberGap = 100; |
2755 static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90; | 2753 static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90; |
2756 class RtpSequenceObserver : public test::RtpRtcpObserver { | 2754 class RtpSequenceObserver : public test::RtpRtcpObserver { |
2757 public: | 2755 public: |
2758 explicit RtpSequenceObserver(bool use_rtx) | 2756 explicit RtpSequenceObserver(bool use_rtx) |
2759 : test::RtpRtcpObserver(kDefaultTimeoutMs), | 2757 : test::RtpRtcpObserver(kDefaultTimeoutMs), |
2760 ssrcs_to_observe_(kNumSsrcs) { | 2758 ssrcs_to_observe_(kNumSsrcs) { |
2761 for (size_t i = 0; i < kNumSsrcs; ++i) { | 2759 for (size_t i = 0; i < kNumSsrcs; ++i) { |
2762 configured_ssrcs_[kSendSsrcs[i]] = true; | 2760 configured_ssrcs_[kVideoSendSsrcs[i]] = true; |
2763 if (use_rtx) | 2761 if (use_rtx) |
2764 configured_ssrcs_[kSendRtxSsrcs[i]] = true; | 2762 configured_ssrcs_[kSendRtxSsrcs[i]] = true; |
2765 } | 2763 } |
2766 } | 2764 } |
2767 | 2765 |
2768 void ResetExpectedSsrcs(size_t num_expected_ssrcs) { | 2766 void ResetExpectedSsrcs(size_t num_expected_ssrcs) { |
2769 rtc::CritScope lock(&crit_); | 2767 rtc::CritScope lock(&crit_); |
2770 ssrc_observed_.clear(); | 2768 ssrc_observed_.clear(); |
2771 ssrcs_to_observe_ = num_expected_ssrcs; | 2769 ssrcs_to_observe_ = num_expected_ssrcs; |
2772 } | 2770 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2845 | 2843 |
2846 test::PacketTransport send_transport(sender_call_.get(), &observer, | 2844 test::PacketTransport send_transport(sender_call_.get(), &observer, |
2847 test::PacketTransport::kSender, | 2845 test::PacketTransport::kSender, |
2848 FakeNetworkPipe::Config()); | 2846 FakeNetworkPipe::Config()); |
2849 test::PacketTransport receive_transport(nullptr, &observer, | 2847 test::PacketTransport receive_transport(nullptr, &observer, |
2850 test::PacketTransport::kReceiver, | 2848 test::PacketTransport::kReceiver, |
2851 FakeNetworkPipe::Config()); | 2849 FakeNetworkPipe::Config()); |
2852 send_transport.SetReceiver(receiver_call_->Receiver()); | 2850 send_transport.SetReceiver(receiver_call_->Receiver()); |
2853 receive_transport.SetReceiver(sender_call_->Receiver()); | 2851 receive_transport.SetReceiver(sender_call_->Receiver()); |
2854 | 2852 |
2855 CreateSendConfig(kNumSsrcs, &send_transport); | 2853 CreateSendConfig(kNumSsrcs, 0, &send_transport); |
2856 | 2854 |
2857 if (use_rtx) { | 2855 if (use_rtx) { |
2858 for (size_t i = 0; i < kNumSsrcs; ++i) { | 2856 for (size_t i = 0; i < kNumSsrcs; ++i) { |
2859 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); | 2857 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); |
2860 } | 2858 } |
2861 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; | 2859 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; |
2862 } | 2860 } |
2863 | 2861 |
2864 // Lower bitrates so that all streams send initially. | 2862 // Lower bitrates so that all streams send initially. |
2865 for (size_t i = 0; i < video_encoder_config_.streams.size(); ++i) { | 2863 for (size_t i = 0; i < video_encoder_config_.streams.size(); ++i) { |
(...skipping 10 matching lines...) Expand all Loading... |
2876 one_stream.streams.front().min_bitrate_bps += | 2874 one_stream.streams.front().min_bitrate_bps += |
2877 video_encoder_config_.streams[i].min_bitrate_bps; | 2875 video_encoder_config_.streams[i].min_bitrate_bps; |
2878 one_stream.streams.front().target_bitrate_bps += | 2876 one_stream.streams.front().target_bitrate_bps += |
2879 video_encoder_config_.streams[i].target_bitrate_bps; | 2877 video_encoder_config_.streams[i].target_bitrate_bps; |
2880 one_stream.streams.front().max_bitrate_bps += | 2878 one_stream.streams.front().max_bitrate_bps += |
2881 video_encoder_config_.streams[i].max_bitrate_bps; | 2879 video_encoder_config_.streams[i].max_bitrate_bps; |
2882 } | 2880 } |
2883 | 2881 |
2884 CreateMatchingReceiveConfigs(&receive_transport); | 2882 CreateMatchingReceiveConfigs(&receive_transport); |
2885 | 2883 |
2886 CreateStreams(); | 2884 CreateVideoStreams(); |
2887 CreateFrameGeneratorCapturer(); | 2885 CreateFrameGeneratorCapturer(); |
2888 | 2886 |
2889 Start(); | 2887 Start(); |
2890 EXPECT_TRUE(observer.Wait()) | 2888 EXPECT_TRUE(observer.Wait()) |
2891 << "Timed out waiting for all SSRCs to send packets."; | 2889 << "Timed out waiting for all SSRCs to send packets."; |
2892 | 2890 |
2893 // Test stream resetting more than once to make sure that the state doesn't | 2891 // Test stream resetting more than once to make sure that the state doesn't |
2894 // get set once (this could be due to using std::map::insert for instance). | 2892 // get set once (this could be due to using std::map::insert for instance). |
2895 for (size_t i = 0; i < 3; ++i) { | 2893 for (size_t i = 0; i < 3; ++i) { |
2896 frame_generator_capturer_->Stop(); | 2894 frame_generator_capturer_->Stop(); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3122 CreateCalls(Call::Config(), Call::Config()); | 3120 CreateCalls(Call::Config(), Call::Config()); |
3123 | 3121 |
3124 FakeNetworkPipe::Config config; | 3122 FakeNetworkPipe::Config config; |
3125 config.queue_delay_ms = kSendDelayMs; | 3123 config.queue_delay_ms = kSendDelayMs; |
3126 test::DirectTransport sender_transport(config, sender_call_.get()); | 3124 test::DirectTransport sender_transport(config, sender_call_.get()); |
3127 config.queue_delay_ms = kReceiveDelayMs; | 3125 config.queue_delay_ms = kReceiveDelayMs; |
3128 test::DirectTransport receiver_transport(config, receiver_call_.get()); | 3126 test::DirectTransport receiver_transport(config, receiver_call_.get()); |
3129 sender_transport.SetReceiver(receiver_call_->Receiver()); | 3127 sender_transport.SetReceiver(receiver_call_->Receiver()); |
3130 receiver_transport.SetReceiver(sender_call_->Receiver()); | 3128 receiver_transport.SetReceiver(sender_call_->Receiver()); |
3131 | 3129 |
3132 CreateSendConfig(1, &sender_transport); | 3130 CreateSendConfig(1, 0, &sender_transport); |
3133 CreateMatchingReceiveConfigs(&receiver_transport); | 3131 CreateMatchingReceiveConfigs(&receiver_transport); |
3134 | 3132 |
3135 CreateStreams(); | 3133 CreateVideoStreams(); |
3136 CreateFrameGeneratorCapturer(); | 3134 CreateFrameGeneratorCapturer(); |
3137 Start(); | 3135 Start(); |
3138 | 3136 |
3139 int64_t start_time_ms = clock_->TimeInMilliseconds(); | 3137 int64_t start_time_ms = clock_->TimeInMilliseconds(); |
3140 while (true) { | 3138 while (true) { |
3141 Call::Stats stats = sender_call_->GetStats(); | 3139 Call::Stats stats = sender_call_->GetStats(); |
3142 ASSERT_GE(start_time_ms + kDefaultTimeoutMs, | 3140 ASSERT_GE(start_time_ms + kDefaultTimeoutMs, |
3143 clock_->TimeInMilliseconds()) | 3141 clock_->TimeInMilliseconds()) |
3144 << "No RTT stats before timeout!"; | 3142 << "No RTT stats before timeout!"; |
3145 if (stats.rtt_ms != -1) { | 3143 if (stats.rtt_ms != -1) { |
(...skipping 17 matching lines...) Expand all Loading... |
3163 ADD_FAILURE() << "Unexpected frame encode."; | 3161 ADD_FAILURE() << "Unexpected frame encode."; |
3164 return test::FakeEncoder::Encode( | 3162 return test::FakeEncoder::Encode( |
3165 input_image, codec_specific_info, frame_types); | 3163 input_image, codec_specific_info, frame_types); |
3166 } | 3164 } |
3167 }; | 3165 }; |
3168 | 3166 |
3169 CreateSenderCall(Call::Config()); | 3167 CreateSenderCall(Call::Config()); |
3170 sender_call_->SignalNetworkState(kNetworkDown); | 3168 sender_call_->SignalNetworkState(kNetworkDown); |
3171 | 3169 |
3172 UnusedTransport transport; | 3170 UnusedTransport transport; |
3173 CreateSendConfig(1, &transport); | 3171 CreateSendConfig(1, 0, &transport); |
3174 UnusedEncoder unused_encoder; | 3172 UnusedEncoder unused_encoder; |
3175 video_send_config_.encoder_settings.encoder = &unused_encoder; | 3173 video_send_config_.encoder_settings.encoder = &unused_encoder; |
3176 CreateStreams(); | 3174 CreateVideoStreams(); |
3177 CreateFrameGeneratorCapturer(); | 3175 CreateFrameGeneratorCapturer(); |
3178 | 3176 |
3179 Start(); | 3177 Start(); |
3180 SleepMs(kSilenceTimeoutMs); | 3178 SleepMs(kSilenceTimeoutMs); |
3181 Stop(); | 3179 Stop(); |
3182 | 3180 |
3183 DestroyStreams(); | 3181 DestroyStreams(); |
3184 } | 3182 } |
3185 | 3183 |
3186 TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { | 3184 TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { |
3187 CreateCalls(Call::Config(), Call::Config()); | 3185 CreateCalls(Call::Config(), Call::Config()); |
3188 receiver_call_->SignalNetworkState(kNetworkDown); | 3186 receiver_call_->SignalNetworkState(kNetworkDown); |
3189 | 3187 |
3190 test::DirectTransport sender_transport(sender_call_.get()); | 3188 test::DirectTransport sender_transport(sender_call_.get()); |
3191 sender_transport.SetReceiver(receiver_call_->Receiver()); | 3189 sender_transport.SetReceiver(receiver_call_->Receiver()); |
3192 CreateSendConfig(1, &sender_transport); | 3190 CreateSendConfig(1, 0, &sender_transport); |
3193 UnusedTransport transport; | 3191 UnusedTransport transport; |
3194 CreateMatchingReceiveConfigs(&transport); | 3192 CreateMatchingReceiveConfigs(&transport); |
3195 CreateStreams(); | 3193 CreateVideoStreams(); |
3196 CreateFrameGeneratorCapturer(); | 3194 CreateFrameGeneratorCapturer(); |
3197 | 3195 |
3198 Start(); | 3196 Start(); |
3199 SleepMs(kSilenceTimeoutMs); | 3197 SleepMs(kSilenceTimeoutMs); |
3200 Stop(); | 3198 Stop(); |
3201 | 3199 |
3202 sender_transport.StopSending(); | 3200 sender_transport.StopSending(); |
3203 | 3201 |
3204 DestroyStreams(); | 3202 DestroyStreams(); |
3205 } | 3203 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3242 << "RTCP XR settings require rtcp-xr to be negotiated."; | 3240 << "RTCP XR settings require rtcp-xr to be negotiated."; |
3243 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) | 3241 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) |
3244 << "Enabling RTX requires rtpmap: rtx negotiation."; | 3242 << "Enabling RTX requires rtpmap: rtx negotiation."; |
3245 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) | 3243 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) |
3246 << "Enabling RTP extensions require negotiation."; | 3244 << "Enabling RTP extensions require negotiation."; |
3247 | 3245 |
3248 VerifyEmptyNackConfig(default_receive_config.rtp.nack); | 3246 VerifyEmptyNackConfig(default_receive_config.rtp.nack); |
3249 VerifyEmptyFecConfig(default_receive_config.rtp.fec); | 3247 VerifyEmptyFecConfig(default_receive_config.rtp.fec); |
3250 } | 3248 } |
3251 | 3249 |
| 3250 TEST_F(EndToEndTest, TransportSeqNumOnAudioAndVideo) { |
| 3251 static const int kExtensionId = 8; |
| 3252 class TransportSequenceNumberTest : public test::EndToEndTest { |
| 3253 public: |
| 3254 TransportSequenceNumberTest() |
| 3255 : EndToEndTest(kDefaultTimeoutMs), |
| 3256 video_observed_(false), |
| 3257 audio_observed_(false) { |
| 3258 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, |
| 3259 kExtensionId); |
| 3260 } |
| 3261 |
| 3262 size_t GetNumVideoStreams() const override { return 1; } |
| 3263 size_t GetNumAudioStreams() const override { return 1; } |
| 3264 |
| 3265 void ModifyVideoConfigs( |
| 3266 VideoSendStream::Config* send_config, |
| 3267 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 3268 VideoEncoderConfig* encoder_config) override { |
| 3269 send_config->rtp.extensions.clear(); |
| 3270 send_config->rtp.extensions.push_back( |
| 3271 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
| 3272 (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions; |
| 3273 } |
| 3274 |
| 3275 void ModifyAudioConfigs( |
| 3276 AudioSendStream::Config* send_config, |
| 3277 std::vector<AudioReceiveStream::Config>* receive_configs) override { |
| 3278 send_config->rtp.extensions.clear(); |
| 3279 send_config->rtp.extensions.push_back( |
| 3280 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
| 3281 (*receive_configs)[0].rtp.extensions.clear(); |
| 3282 (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions; |
| 3283 } |
| 3284 |
| 3285 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 3286 RTPHeader header; |
| 3287 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
| 3288 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
| 3289 // Unwrap packet id and verify uniqueness. |
| 3290 int64_t packet_id = |
| 3291 unwrapper_.Unwrap(header.extension.transportSequenceNumber); |
| 3292 EXPECT_TRUE(received_packet_ids_.insert(packet_id).second); |
| 3293 |
| 3294 if (header.ssrc == kVideoSendSsrcs[0]) |
| 3295 video_observed_ = true; |
| 3296 if (header.ssrc == kAudioSendSsrc) |
| 3297 audio_observed_ = true; |
| 3298 if (audio_observed_ && video_observed_ && |
| 3299 received_packet_ids_.size() == 50) { |
| 3300 size_t packet_id_range = |
| 3301 *received_packet_ids_.rbegin() - *received_packet_ids_.begin() + 1; |
| 3302 EXPECT_EQ(received_packet_ids_.size(), packet_id_range); |
| 3303 observation_complete_.Set(); |
| 3304 } |
| 3305 return SEND_PACKET; |
| 3306 } |
| 3307 |
| 3308 void PerformTest() override { |
| 3309 EXPECT_TRUE(Wait()) << "Timed out while waiting for audio and video " |
| 3310 "packets with transport sequence number."; |
| 3311 } |
| 3312 |
| 3313 private: |
| 3314 bool video_observed_; |
| 3315 bool audio_observed_; |
| 3316 SequenceNumberUnwrapper unwrapper_; |
| 3317 std::set<int64_t> received_packet_ids_; |
| 3318 } test; |
| 3319 |
| 3320 RunBaseTest(&test, FakeNetworkPipe::Config()); |
| 3321 } |
3252 } // namespace webrtc | 3322 } // namespace webrtc |
OLD | NEW |