| Index: webrtc/test/call_test.cc
|
| diff --git a/webrtc/test/call_test.cc b/webrtc/test/call_test.cc
|
| index be437430b62f5c6243a3e5b9e4142b4a35291a4c..ddff55256532a427d5b79cc2b9f7895dc36d1080 100644
|
| --- a/webrtc/test/call_test.cc
|
| +++ b/webrtc/test/call_test.cc
|
| @@ -7,10 +7,14 @@
|
| * in the file PATENTS. All contributing project authors may
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
| +
|
| +#include "webrtc/test/call_test.h"
|
| +
|
| +#include <algorithm>
|
| +
|
| #include "webrtc/base/checks.h"
|
| #include "webrtc/config.h"
|
| #include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
|
| -#include "webrtc/test/call_test.h"
|
| #include "webrtc/test/testsupport/fileutils.h"
|
| #include "webrtc/voice_engine/include/voe_base.h"
|
|
|
| @@ -30,6 +34,7 @@ CallTest::CallTest()
|
| fake_encoder_(clock_),
|
| num_video_streams_(1),
|
| num_audio_streams_(0),
|
| + num_flexfec_streams_(0),
|
| decoder_factory_(CreateBuiltinAudioDecoderFactory()),
|
| fake_send_audio_device_(nullptr),
|
| fake_recv_audio_device_(nullptr) {}
|
| @@ -40,6 +45,7 @@ CallTest::~CallTest() {
|
| void CallTest::RunBaseTest(BaseTest* test) {
|
| num_video_streams_ = test->GetNumVideoStreams();
|
| num_audio_streams_ = test->GetNumAudioStreams();
|
| + num_flexfec_streams_ = test->GetNumFlexfecStreams();
|
| RTC_DCHECK(num_video_streams_ > 0 || num_audio_streams_ > 0);
|
| Call::Config send_config(test->GetSenderCallConfig());
|
| if (num_audio_streams_ > 0) {
|
| @@ -71,7 +77,7 @@ void CallTest::RunBaseTest(BaseTest* test) {
|
| receive_transport_->SetReceiver(nullptr);
|
| }
|
|
|
| - CreateSendConfig(num_video_streams_, num_audio_streams_,
|
| + CreateSendConfig(num_video_streams_, num_audio_streams_, num_flexfec_streams_,
|
| send_transport_.get());
|
| if (test->ShouldCreateReceivers()) {
|
| CreateMatchingReceiveConfigs(receive_transport_.get());
|
| @@ -80,8 +86,12 @@ void CallTest::RunBaseTest(BaseTest* test) {
|
| test->ModifyVideoConfigs(&video_send_config_, &video_receive_configs_,
|
| &video_encoder_config_);
|
| }
|
| - if (num_audio_streams_ > 0)
|
| + if (num_audio_streams_ > 0) {
|
| test->ModifyAudioConfigs(&audio_send_config_, &audio_receive_configs_);
|
| + }
|
| + if (num_flexfec_streams_ > 0) {
|
| + test->ModifyFlexfecConfigs(&flexfec_receive_configs_);
|
| + }
|
|
|
| if (num_video_streams_ > 0) {
|
| CreateVideoStreams();
|
| @@ -91,6 +101,10 @@ void CallTest::RunBaseTest(BaseTest* test) {
|
| CreateAudioStreams();
|
| test->OnAudioStreamsCreated(audio_send_stream_, audio_receive_streams_);
|
| }
|
| + if (num_flexfec_streams_ > 0) {
|
| + CreateFlexfecStreams();
|
| + test->OnFlexfecStreamsCreated(flexfec_receive_streams_);
|
| + }
|
|
|
| if (num_video_streams_ > 0) {
|
| int width = kDefaultWidth;
|
| @@ -129,6 +143,8 @@ void CallTest::Start() {
|
| fake_recv_audio_device_->Start();
|
| EXPECT_EQ(0, voe_recv_.base->StartPlayout(voe_recv_.channel_id));
|
| }
|
| + for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
|
| + flexfec_recv_stream->Start();
|
| if (frame_generator_capturer_.get() != NULL)
|
| frame_generator_capturer_->Start();
|
| }
|
| @@ -136,6 +152,8 @@ void CallTest::Start() {
|
| void CallTest::Stop() {
|
| if (frame_generator_capturer_.get() != NULL)
|
| frame_generator_capturer_->Stop();
|
| + for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
|
| + flexfec_recv_stream->Stop();
|
| if (!audio_receive_streams_.empty()) {
|
| fake_recv_audio_device_->Stop();
|
| EXPECT_EQ(0, voe_recv_.base->StopPlayout(voe_recv_.channel_id));
|
| @@ -174,9 +192,11 @@ void CallTest::DestroyCalls() {
|
|
|
| void CallTest::CreateSendConfig(size_t num_video_streams,
|
| size_t num_audio_streams,
|
| + size_t num_flexfec_streams,
|
| Transport* send_transport) {
|
| RTC_DCHECK(num_video_streams <= kNumSsrcs);
|
| RTC_DCHECK_LE(num_audio_streams, 1u);
|
| + RTC_DCHECK_LE(num_flexfec_streams, 1u);
|
| RTC_DCHECK(num_audio_streams == 0 || voe_send_.channel_id >= 0);
|
| if (num_video_streams > 0) {
|
| video_send_config_ = VideoSendStream::Config(send_transport);
|
| @@ -201,6 +221,13 @@ void CallTest::CreateSendConfig(size_t num_video_streams,
|
| audio_send_config_.send_codec_spec.codec_inst =
|
| CodecInst{kAudioSendPayloadType, "ISAC", 16000, 480, 1, 32000};
|
| }
|
| +
|
| + // TODO(brandtr): Update this when we support multistream protection.
|
| + if (num_flexfec_streams > 0) {
|
| + video_send_config_.rtp.flexfec.flexfec_payload_type = kFlexfecPayloadType;
|
| + video_send_config_.rtp.flexfec.flexfec_ssrc = kFlexfecSendSsrc;
|
| + video_send_config_.rtp.flexfec.protected_media_ssrcs = {kVideoSendSsrcs[0]};
|
| + }
|
| }
|
|
|
| void CallTest::CreateMatchingReceiveConfigs(Transport* rtcp_send_transport) {
|
| @@ -237,6 +264,16 @@ void CallTest::CreateMatchingReceiveConfigs(Transport* rtcp_send_transport) {
|
| audio_config.decoder_factory = decoder_factory_;
|
| audio_receive_configs_.push_back(audio_config);
|
| }
|
| +
|
| + // TODO(brandtr): Update this when we support multistream protection.
|
| + RTC_DCHECK(num_flexfec_streams_ <= 1);
|
| + if (num_flexfec_streams_ == 1) {
|
| + FlexfecReceiveStream::Config flexfec_config;
|
| + flexfec_config.flexfec_payload_type = kFlexfecPayloadType;
|
| + flexfec_config.flexfec_ssrc = kFlexfecSendSsrc;
|
| + flexfec_config.protected_media_ssrcs = {kVideoSendSsrcs[0]};
|
| + flexfec_receive_configs_.push_back(flexfec_config);
|
| + }
|
| }
|
|
|
| void CallTest::CreateFrameGeneratorCapturerWithDrift(Clock* clock,
|
| @@ -296,6 +333,14 @@ void CallTest::CreateAudioStreams() {
|
| }
|
| }
|
|
|
| +void CallTest::CreateFlexfecStreams() {
|
| + for (size_t i = 0; i < flexfec_receive_configs_.size(); ++i) {
|
| + flexfec_receive_streams_.push_back(
|
| + receiver_call_->CreateFlexfecReceiveStream(
|
| + flexfec_receive_configs_[i]));
|
| + }
|
| +}
|
| +
|
| void CallTest::DestroyStreams() {
|
| if (video_send_stream_)
|
| sender_call_->DestroyVideoSendStream(video_send_stream_);
|
| @@ -308,8 +353,11 @@ void CallTest::DestroyStreams() {
|
| audio_send_stream_ = nullptr;
|
| for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
|
| receiver_call_->DestroyAudioReceiveStream(audio_recv_stream);
|
| - video_receive_streams_.clear();
|
|
|
| + for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
|
| + receiver_call_->DestroyFlexfecReceiveStream(flexfec_recv_stream);
|
| +
|
| + video_receive_streams_.clear();
|
| allocated_decoders_.clear();
|
| }
|
|
|
| @@ -360,12 +408,14 @@ const uint8_t CallTest::kSendRtxPayloadType = 98;
|
| const uint8_t CallTest::kRedPayloadType = 118;
|
| const uint8_t CallTest::kRtxRedPayloadType = 99;
|
| const uint8_t CallTest::kUlpfecPayloadType = 119;
|
| +const uint8_t CallTest::kFlexfecPayloadType = 120;
|
| const uint8_t CallTest::kAudioSendPayloadType = 103;
|
| const uint32_t CallTest::kSendRtxSsrcs[kNumSsrcs] = {0xBADCAFD, 0xBADCAFE,
|
| 0xBADCAFF};
|
| const uint32_t CallTest::kVideoSendSsrcs[kNumSsrcs] = {0xC0FFED, 0xC0FFEE,
|
| 0xC0FFEF};
|
| const uint32_t CallTest::kAudioSendSsrc = 0xDEADBEEF;
|
| +const uint32_t CallTest::kFlexfecSendSsrc = 0xBADBEEF;
|
| const uint32_t CallTest::kReceiverLocalVideoSsrc = 0x123456;
|
| const uint32_t CallTest::kReceiverLocalAudioSsrc = 0x1234567;
|
| const int CallTest::kNackRtpHistoryMs = 1000;
|
| @@ -405,6 +455,10 @@ size_t BaseTest::GetNumAudioStreams() const {
|
| return 0;
|
| }
|
|
|
| +size_t BaseTest::GetNumFlexfecStreams() const {
|
| + return 0;
|
| +}
|
| +
|
| void BaseTest::ModifyVideoConfigs(
|
| VideoSendStream::Config* send_config,
|
| std::vector<VideoReceiveStream::Config>* receive_configs,
|
| @@ -426,6 +480,12 @@ void BaseTest::OnAudioStreamsCreated(
|
| AudioSendStream* send_stream,
|
| const std::vector<AudioReceiveStream*>& receive_streams) {}
|
|
|
| +void BaseTest::ModifyFlexfecConfigs(
|
| + std::vector<FlexfecReceiveStream::Config>* receive_configs) {}
|
| +
|
| +void BaseTest::OnFlexfecStreamsCreated(
|
| + const std::vector<FlexfecReceiveStream*>& receive_streams) {}
|
| +
|
| void BaseTest::OnFrameGeneratorCapturerCreated(
|
| FrameGeneratorCapturer* frame_generator_capturer) {
|
| }
|
|
|