OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/test/call_test.h" | 11 #include "webrtc/test/call_test.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 | 14 |
15 #include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" | 15 #include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" |
16 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
17 #include "webrtc/config.h" | 17 #include "webrtc/config.h" |
18 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h" | 18 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h" |
19 #include "webrtc/test/testsupport/fileutils.h" | 19 #include "webrtc/test/testsupport/fileutils.h" |
20 #include "webrtc/voice_engine/include/voe_base.h" | 20 #include "webrtc/voice_engine/include/voe_base.h" |
21 | 21 |
22 namespace webrtc { | 22 namespace webrtc { |
23 namespace test { | 23 namespace test { |
24 | 24 |
25 namespace { | 25 namespace { |
26 const int kVideoRotationRtpExtensionId = 4; | 26 const int kVideoRotationRtpExtensionId = 4; |
27 } | 27 } |
28 | 28 |
29 void CallTest::PayloadDemuxer::SetReceiver(PacketReceiver* receiver) { | |
30 receiver_ = receiver; | |
31 } | |
32 | |
33 PacketReceiver::DeliveryStatus CallTest::PayloadDemuxer::DeliverPacket( | |
34 MediaType media_type, | |
35 const uint8_t* packet, | |
36 size_t length, | |
37 const PacketTime& packet_time) { | |
38 if (media_type == MediaType::ANY) { | |
39 // This simplistic demux logic will not make much sense for RTCP | |
40 // packets, but it seems that doesn't matter. | |
41 RTC_CHECK_GE(length, 2); | |
42 uint8_t pt = packet[1] & 0x7f; | |
43 if (pt == kFakeVideoSendPayloadType || pt == kFlexfecPayloadType) { | |
44 media_type = MediaType::VIDEO; | |
45 } else { | |
46 media_type = MediaType::AUDIO; | |
47 } | |
48 } | |
49 return receiver_->DeliverPacket(media_type, packet, length, packet_time); | |
50 } | |
51 | |
52 CallTest::CallTest() | 29 CallTest::CallTest() |
53 : clock_(Clock::GetRealTimeClock()), | 30 : clock_(Clock::GetRealTimeClock()), |
54 event_log_(RtcEventLog::CreateNull()), | 31 event_log_(RtcEventLog::CreateNull()), |
55 video_send_config_(nullptr), | 32 video_send_config_(nullptr), |
56 video_send_stream_(nullptr), | 33 video_send_stream_(nullptr), |
57 audio_send_config_(nullptr), | 34 audio_send_config_(nullptr), |
58 audio_send_stream_(nullptr), | 35 audio_send_stream_(nullptr), |
59 fake_encoder_(clock_), | 36 fake_encoder_(clock_), |
60 num_video_streams_(1), | 37 num_video_streams_(1), |
61 num_audio_streams_(0), | 38 num_audio_streams_(0), |
(...skipping 30 matching lines...) Expand all Loading... |
92 audio_state_config.audio_mixer = AudioMixerImpl::Create(); | 69 audio_state_config.audio_mixer = AudioMixerImpl::Create(); |
93 recv_config.audio_state = AudioState::Create(audio_state_config); | 70 recv_config.audio_state = AudioState::Create(audio_state_config); |
94 } | 71 } |
95 CreateReceiverCall(recv_config); | 72 CreateReceiverCall(recv_config); |
96 } | 73 } |
97 test->OnCallsCreated(sender_call_.get(), receiver_call_.get()); | 74 test->OnCallsCreated(sender_call_.get(), receiver_call_.get()); |
98 receive_transport_.reset(test->CreateReceiveTransport()); | 75 receive_transport_.reset(test->CreateReceiveTransport()); |
99 send_transport_.reset(test->CreateSendTransport(sender_call_.get())); | 76 send_transport_.reset(test->CreateSendTransport(sender_call_.get())); |
100 | 77 |
101 if (test->ShouldCreateReceivers()) { | 78 if (test->ShouldCreateReceivers()) { |
102 // For tests using only video or only audio, we rely on each test | 79 send_transport_->SetReceiver(receiver_call_->Receiver()); |
103 // configuring the underlying FakeNetworkPipe with the right media | 80 receive_transport_->SetReceiver(sender_call_->Receiver()); |
104 // type. But for tests sending both video and audio over the same | |
105 // FakeNetworkPipe, we need to "demux", i.e., setting the | |
106 // MediaType based on RTP payload type. | |
107 if (num_video_streams_ > 0 && num_audio_streams_ > 0) { | |
108 receive_demuxer_.SetReceiver(receiver_call_->Receiver()); | |
109 send_transport_->SetReceiver(&receive_demuxer_); | |
110 send_demuxer_.SetReceiver(sender_call_->Receiver()); | |
111 receive_transport_->SetReceiver(&send_demuxer_); | |
112 } else { | |
113 send_transport_->SetReceiver(receiver_call_->Receiver()); | |
114 receive_transport_->SetReceiver(sender_call_->Receiver()); | |
115 } | |
116 if (num_video_streams_ > 0) | 81 if (num_video_streams_ > 0) |
117 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | 82 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); |
118 if (num_audio_streams_ > 0) | 83 if (num_audio_streams_ > 0) |
119 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); | 84 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); |
120 } else { | 85 } else { |
121 // Sender-only call delivers to itself. | 86 // Sender-only call delivers to itself. |
122 send_transport_->SetReceiver(sender_call_->Receiver()); | 87 send_transport_->SetReceiver(sender_call_->Receiver()); |
123 receive_transport_->SetReceiver(nullptr); | 88 receive_transport_->SetReceiver(nullptr); |
124 } | 89 } |
125 | 90 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 | 258 |
294 RTC_DCHECK_GE(1, num_audio_streams_); | 259 RTC_DCHECK_GE(1, num_audio_streams_); |
295 if (num_audio_streams_ == 1) { | 260 if (num_audio_streams_ == 1) { |
296 RTC_DCHECK_LE(0, voe_send_.channel_id); | 261 RTC_DCHECK_LE(0, voe_send_.channel_id); |
297 AudioReceiveStream::Config audio_config; | 262 AudioReceiveStream::Config audio_config; |
298 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; | 263 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; |
299 audio_config.rtcp_send_transport = rtcp_send_transport; | 264 audio_config.rtcp_send_transport = rtcp_send_transport; |
300 audio_config.voe_channel_id = voe_recv_.channel_id; | 265 audio_config.voe_channel_id = voe_recv_.channel_id; |
301 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; | 266 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; |
302 audio_config.decoder_factory = decoder_factory_; | 267 audio_config.decoder_factory = decoder_factory_; |
303 audio_config.decoder_map = {{120, {"opus", 48000, 2}}}; | 268 audio_config.decoder_map = {{kAudioSendPayloadType, {"opus", 48000, 2}}}; |
304 audio_receive_configs_.push_back(audio_config); | 269 audio_receive_configs_.push_back(audio_config); |
305 } | 270 } |
306 | 271 |
307 // TODO(brandtr): Update this when we support multistream protection. | 272 // TODO(brandtr): Update this when we support multistream protection. |
308 RTC_DCHECK(num_flexfec_streams_ <= 1); | 273 RTC_DCHECK(num_flexfec_streams_ <= 1); |
309 if (num_flexfec_streams_ == 1) { | 274 if (num_flexfec_streams_ == 1) { |
310 FlexfecReceiveStream::Config config(rtcp_send_transport); | 275 FlexfecReceiveStream::Config config(rtcp_send_transport); |
311 config.payload_type = kFlexfecPayloadType; | 276 config.payload_type = kFlexfecPayloadType; |
312 config.remote_ssrc = kFlexfecSendSsrc; | 277 config.remote_ssrc = kFlexfecSendSsrc; |
313 config.protected_media_ssrcs = {kVideoSendSsrcs[0]}; | 278 config.protected_media_ssrcs = {kVideoSendSsrcs[0]}; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 const uint32_t CallTest::kSendRtxSsrcs[kNumSsrcs] = {0xBADCAFD, 0xBADCAFE, | 420 const uint32_t CallTest::kSendRtxSsrcs[kNumSsrcs] = {0xBADCAFD, 0xBADCAFE, |
456 0xBADCAFF}; | 421 0xBADCAFF}; |
457 const uint32_t CallTest::kVideoSendSsrcs[kNumSsrcs] = {0xC0FFED, 0xC0FFEE, | 422 const uint32_t CallTest::kVideoSendSsrcs[kNumSsrcs] = {0xC0FFED, 0xC0FFEE, |
458 0xC0FFEF}; | 423 0xC0FFEF}; |
459 const uint32_t CallTest::kAudioSendSsrc = 0xDEADBEEF; | 424 const uint32_t CallTest::kAudioSendSsrc = 0xDEADBEEF; |
460 const uint32_t CallTest::kFlexfecSendSsrc = 0xBADBEEF; | 425 const uint32_t CallTest::kFlexfecSendSsrc = 0xBADBEEF; |
461 const uint32_t CallTest::kReceiverLocalVideoSsrc = 0x123456; | 426 const uint32_t CallTest::kReceiverLocalVideoSsrc = 0x123456; |
462 const uint32_t CallTest::kReceiverLocalAudioSsrc = 0x1234567; | 427 const uint32_t CallTest::kReceiverLocalAudioSsrc = 0x1234567; |
463 const int CallTest::kNackRtpHistoryMs = 1000; | 428 const int CallTest::kNackRtpHistoryMs = 1000; |
464 | 429 |
| 430 const std::map<uint8_t, MediaType> CallTest::payload_type_map_ = { |
| 431 {CallTest::kVideoSendPayloadType, MediaType::VIDEO}, |
| 432 {CallTest::kFakeVideoSendPayloadType, MediaType::VIDEO}, |
| 433 {CallTest::kSendRtxPayloadType, MediaType::VIDEO}, |
| 434 {CallTest::kRedPayloadType, MediaType::VIDEO}, |
| 435 {CallTest::kRtxRedPayloadType, MediaType::VIDEO}, |
| 436 {CallTest::kUlpfecPayloadType, MediaType::VIDEO}, |
| 437 {CallTest::kFlexfecPayloadType, MediaType::VIDEO}, |
| 438 {CallTest::kAudioSendPayloadType, MediaType::AUDIO}}; |
| 439 |
465 BaseTest::BaseTest() : event_log_(RtcEventLog::CreateNull()) {} | 440 BaseTest::BaseTest() : event_log_(RtcEventLog::CreateNull()) {} |
466 | 441 |
467 BaseTest::BaseTest(unsigned int timeout_ms) | 442 BaseTest::BaseTest(unsigned int timeout_ms) |
468 : RtpRtcpObserver(timeout_ms), event_log_(RtcEventLog::CreateNull()) {} | 443 : RtpRtcpObserver(timeout_ms), event_log_(RtcEventLog::CreateNull()) {} |
469 | 444 |
470 BaseTest::~BaseTest() { | 445 BaseTest::~BaseTest() { |
471 } | 446 } |
472 | 447 |
473 std::unique_ptr<FakeAudioDevice::Capturer> BaseTest::CreateCapturer() { | 448 std::unique_ptr<FakeAudioDevice::Capturer> BaseTest::CreateCapturer() { |
474 return FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000); | 449 return FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000); |
(...skipping 11 matching lines...) Expand all Loading... |
486 return Call::Config(event_log_.get()); | 461 return Call::Config(event_log_.get()); |
487 } | 462 } |
488 | 463 |
489 Call::Config BaseTest::GetReceiverCallConfig() { | 464 Call::Config BaseTest::GetReceiverCallConfig() { |
490 return Call::Config(event_log_.get()); | 465 return Call::Config(event_log_.get()); |
491 } | 466 } |
492 | 467 |
493 void BaseTest::OnCallsCreated(Call* sender_call, Call* receiver_call) { | 468 void BaseTest::OnCallsCreated(Call* sender_call, Call* receiver_call) { |
494 } | 469 } |
495 | 470 |
496 MediaType BaseTest::SelectMediaType() { | |
497 if (GetNumVideoStreams() > 0) { | |
498 if (GetNumAudioStreams() > 0) { | |
499 // Relies on PayloadDemuxer to set media type from payload type. | |
500 return MediaType::ANY; | |
501 } else { | |
502 return MediaType::VIDEO; | |
503 } | |
504 } else { | |
505 return MediaType::AUDIO; | |
506 } | |
507 } | |
508 | |
509 test::PacketTransport* BaseTest::CreateSendTransport(Call* sender_call) { | 471 test::PacketTransport* BaseTest::CreateSendTransport(Call* sender_call) { |
510 return new PacketTransport(sender_call, this, test::PacketTransport::kSender, | 472 return new PacketTransport(sender_call, this, test::PacketTransport::kSender, |
511 SelectMediaType(), | 473 CallTest::payload_type_map_, |
512 FakeNetworkPipe::Config()); | 474 FakeNetworkPipe::Config()); |
513 } | 475 } |
514 | 476 |
515 test::PacketTransport* BaseTest::CreateReceiveTransport() { | 477 test::PacketTransport* BaseTest::CreateReceiveTransport() { |
516 return new PacketTransport(nullptr, this, test::PacketTransport::kReceiver, | 478 return new PacketTransport(nullptr, this, test::PacketTransport::kReceiver, |
517 SelectMediaType(), | 479 CallTest::payload_type_map_, |
518 FakeNetworkPipe::Config()); | 480 FakeNetworkPipe::Config()); |
519 } | 481 } |
520 | 482 |
521 size_t BaseTest::GetNumVideoStreams() const { | 483 size_t BaseTest::GetNumVideoStreams() const { |
522 return 1; | 484 return 1; |
523 } | 485 } |
524 | 486 |
525 size_t BaseTest::GetNumAudioStreams() const { | 487 size_t BaseTest::GetNumAudioStreams() const { |
526 return 0; | 488 return 0; |
527 } | 489 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 | 537 |
576 EndToEndTest::EndToEndTest(unsigned int timeout_ms) : BaseTest(timeout_ms) { | 538 EndToEndTest::EndToEndTest(unsigned int timeout_ms) : BaseTest(timeout_ms) { |
577 } | 539 } |
578 | 540 |
579 bool EndToEndTest::ShouldCreateReceivers() const { | 541 bool EndToEndTest::ShouldCreateReceivers() const { |
580 return true; | 542 return true; |
581 } | 543 } |
582 | 544 |
583 } // namespace test | 545 } // namespace test |
584 } // namespace webrtc | 546 } // namespace webrtc |
OLD | NEW |