Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: webrtc/video/end_to_end_tests.cc

Issue 1542653002: Add audio streams to CallTest and a first A/V call test. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Comment addressed Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/test/call_test.cc ('k') | webrtc/video/video_quality_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/test/call_test.cc ('k') | webrtc/video/video_quality_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698