From 0a617e22a46d476abcaaa081cc90300d335da9f9 Mon Sep 17 00:00:00 2001 From: solenberg Date: Tue, 20 Oct 2015 15:49:38 -0700 Subject: [PATCH] Remove the default send channel in WVoE. BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1364643003 Cr-Commit-Position: refs/heads/master@{#10344} --- talk/media/webrtc/webrtcvoiceengine.cc | 285 +++++++----------- talk/media/webrtc/webrtcvoiceengine.h | 19 +- .../webrtc/webrtcvoiceengine_unittest.cc | 57 ++-- 3 files changed, 132 insertions(+), 229 deletions(-) diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc index 2a3df2db63..5375358e0f 100644 --- a/talk/media/webrtc/webrtcvoiceengine.cc +++ b/talk/media/webrtc/webrtcvoiceengine.cc @@ -598,13 +598,7 @@ void WebRtcVoiceEngine::Terminate() { VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel(webrtc::Call* call, const AudioOptions& options) { - WebRtcVoiceMediaChannel* ch = - new WebRtcVoiceMediaChannel(this, options, call); - if (!ch->valid()) { - delete ch; - return nullptr; - } - return ch; + return new WebRtcVoiceMediaChannel(this, options, call); } bool WebRtcVoiceEngine::SetOptions(const AudioOptions& options) { @@ -1315,12 +1309,8 @@ void WebRtcVoiceEngine::StopRtcEventLog() { voe_wrapper_->codec()->GetEventLog()->StopLogging(); } -int WebRtcVoiceEngine::CreateVoiceChannel(VoEWrapper* voice_engine_wrapper) { - return voice_engine_wrapper->base()->CreateChannel(voe_config_); -} - -int WebRtcVoiceEngine::CreateMediaVoiceChannel() { - return CreateVoiceChannel(voe_wrapper_.get()); +int WebRtcVoiceEngine::CreateVoEChannel() { + return voe_wrapper_->base()->CreateChannel(voe_config_); } class WebRtcVoiceMediaChannel::WebRtcVoiceChannelRenderer @@ -1404,7 +1394,6 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, const AudioOptions& options, webrtc::Call* call) : engine_(engine), - default_send_channel_id_(engine->CreateMediaVoiceChannel()), send_bitrate_setting_(false), send_bitrate_bps_(0), options_(), @@ -1417,36 +1406,29 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, send_(SEND_NOTHING), call_(call) { RTC_DCHECK(thread_checker_.CalledOnValidThread()); - engine->RegisterChannel(this); - LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel " - << default_send_channel_id(); + LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel"; RTC_DCHECK(nullptr != call); - ConfigureSendChannel(default_send_channel_id()); + engine->RegisterChannel(this); SetOptions(options); } WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { RTC_DCHECK(thread_checker_.CalledOnValidThread()); - LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel " - << default_send_channel_id(); + LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel"; - // Remove any remaining send streams, the default channel will be deleted - // later. + // Remove any remaining send streams. while (!send_channels_.empty()) { RemoveSendStream(send_channels_.begin()->first); } - // Unregister ourselves from the engine. - engine()->UnregisterChannel(this); - - // Remove any remaining streams. + // Remove any remaining receive streams. while (!receive_channels_.empty()) { RemoveRecvStream(receive_channels_.begin()->first); } RTC_DCHECK(receive_streams_.empty()); - // Delete the default channel. - DeleteChannel(default_send_channel_id()); + // Unregister ourselves from the engine. + engine()->UnregisterChannel(this); } bool WebRtcVoiceMediaChannel::SetSendParameters( @@ -1785,15 +1767,11 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( } // Set nack status on receive channels and update |nack_enabled_|. - SetNack(receive_channels_, nack_enabled_); - return true; -} - -void WebRtcVoiceMediaChannel::SetNack(const ChannelMap& channels, - bool nack_enabled) { - for (const auto& ch : channels) { - SetNack(ch.second->channel(), nack_enabled); + for (const auto& ch : receive_channels_) { + SetNack(ch.second->channel(), nack_enabled_); } + + return true; } void WebRtcVoiceMediaChannel::SetNack(int channel, bool nack_enabled) { @@ -1806,18 +1784,6 @@ void WebRtcVoiceMediaChannel::SetNack(int channel, bool nack_enabled) { } } -bool WebRtcVoiceMediaChannel::SetSendCodec( - const webrtc::CodecInst& send_codec) { - LOG(LS_INFO) << "Selected voice codec " << ToString(send_codec) - << ", bitrate=" << send_codec.rate; - for (const auto& ch : send_channels_) { - if (!SetSendCodec(ch.second->channel(), send_codec)) - return false; - } - - return true; -} - bool WebRtcVoiceMediaChannel::SetSendCodec( int channel, const webrtc::CodecInst& send_codec) { LOG(LS_INFO) << "Send channel " << channel << " selected voice codec " @@ -1905,15 +1871,6 @@ bool WebRtcVoiceMediaChannel::SetSendRtpHeaderExtensions( return true; } - // The default channel may or may not be in |send_channels_|. Set the rtp - // header extensions for default channel regardless. - - if (!SetChannelSendRtpHeaderExtensions(default_send_channel_id(), - extensions)) { - return false; - } - - // Loop through all send channels and enable/disable the extensions. for (const auto& ch : send_channels_) { if (!SetChannelSendRtpHeaderExtensions(ch.second->channel(), extensions)) { return false; @@ -2055,61 +2012,67 @@ bool WebRtcVoiceMediaChannel::SetAudioSend(uint32_t ssrc, return true; } -// TODO(ronghuawu): Change this method to return bool. -void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) { - if (engine()->voe()->network()->RegisterExternalTransport( - channel, *this) == -1) { - LOG_RTCERR2(RegisterExternalTransport, channel, this); +int WebRtcVoiceMediaChannel::CreateVoEChannel() { + int id = engine()->CreateVoEChannel(); + if (id == -1) { + LOG_RTCERR0(CreateVoEChannel); + return -1; } - - // Enable RTCP (for quality stats and feedback messages) - EnableRtcp(channel); - - // Set RTP header extension for the new channel. - SetChannelSendRtpHeaderExtensions(channel, send_extensions_); + if (engine()->voe()->network()->RegisterExternalTransport(id, *this) == -1) { + LOG_RTCERR2(RegisterExternalTransport, id, this); + engine()->voe()->base()->DeleteChannel(id); + return -1; + } + return id; } bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) { if (engine()->voe()->network()->DeRegisterExternalTransport(channel) == -1) { LOG_RTCERR1(DeRegisterExternalTransport, channel); } - if (engine()->voe()->base()->DeleteChannel(channel) == -1) { LOG_RTCERR1(DeleteChannel, channel); return false; } - return true; } bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) { RTC_DCHECK(thread_checker_.CalledOnValidThread()); - // If the default channel is already used for sending create a new channel - // otherwise use the default channel for sending. - int channel = GetSendChannelId(sp.first_ssrc()); - if (channel != -1) { - LOG(LS_ERROR) << "Stream already exists with ssrc " << sp.first_ssrc(); + LOG(LS_INFO) << "AddSendStream: " << sp.ToString(); + + uint32_t ssrc = sp.first_ssrc(); + RTC_DCHECK(0 != ssrc); + + if (GetSendChannelId(ssrc) != -1) { + LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc; return false; } - bool default_channel_is_available = true; - for (const auto& ch : send_channels_) { - if (IsDefaultChannel(ch.second->channel())) { - default_channel_is_available = false; - break; - } + // Create a new channel for sending audio data. + int channel = CreateVoEChannel(); + if (channel == -1) { + return false; } - if (default_channel_is_available) { - channel = default_send_channel_id(); - } else { - // Create a new channel for sending audio data. - channel = engine()->CreateMediaVoiceChannel(); - if (channel == -1) { - LOG_RTCERR0(CreateChannel); - return false; - } - ConfigureSendChannel(channel); + // Enable RTCP (for quality stats and feedback messages). + if (engine()->voe()->rtp()->SetRTCPStatus(channel, true) == -1) { + LOG_RTCERR2(SetRTCPStatus, channel, 1); + } + + SetChannelSendRtpHeaderExtensions(channel, send_extensions_); + + // Set the local (send) SSRC. + if (engine()->voe()->rtp()->SetLocalSSRC(channel, ssrc) == -1) { + LOG_RTCERR2(SetLocalSSRC, channel, ssrc); + DeleteChannel(channel); + return false; + } + + if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) { + LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname); + DeleteChannel(channel); + return false; } // Save the channel to send_channels_, so that RemoveSendStream() can still @@ -2117,45 +2080,39 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) { webrtc::AudioTransport* audio_transport = engine()->voe()->base()->audio_transport(); send_channels_.insert( - std::make_pair(sp.first_ssrc(), + std::make_pair(ssrc, new WebRtcVoiceChannelRenderer(channel, audio_transport))); - // Set the send (local) SSRC. - // If there are multiple send SSRCs, we can only set the first one here, and - // the rest of the SSRC(s) need to be set after SetSendCodec has been called - // (with a codec requires multiple SSRC(s)). - if (engine()->voe()->rtp()->SetLocalSSRC(channel, sp.first_ssrc()) == -1) { - LOG_RTCERR2(SetSendSSRC, channel, sp.first_ssrc()); + // Set the current codecs to be used for the new channel. We need to do this + // after adding the channel to send_channels_, because of how max bitrate is + // currently being configured by SetSendCodec(). + if (!send_codecs_.empty() && !SetSendCodecs(channel, send_codecs_)) { + RemoveSendStream(ssrc); return false; } // At this point the channel's local SSRC has been updated. If the channel is - // the default channel make sure that all the receive channels are updated as - // well. Receive channels have to have the same SSRC as the default channel in - // order to send receiver reports with this SSRC. - if (IsDefaultChannel(channel)) { + // the first send channel make sure that all the receive channels are updated + // with the same SSRC in order to send receiver reports. + if (send_channels_.size() == 1) { + receiver_reports_ssrc_ = ssrc; for (const auto& ch : receive_channels_) { - if (engine()->voe()->rtp()->SetLocalSSRC(ch.second->channel(), - sp.first_ssrc()) != 0) { - LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), sp.first_ssrc()); + int recv_channel = ch.second->channel(); + if (engine()->voe()->rtp()->SetLocalSSRC(recv_channel, ssrc) != 0) { + LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), ssrc); return false; } + engine()->voe()->base()->AssociateSendChannel(recv_channel, channel); + LOG(LS_INFO) << "VoiceEngine channel #" << recv_channel + << " is associated with channel #" << channel << "."; } } - if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) { - LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname); - return false; - } - - // Set the current codecs to be used for the new channel. - if (!send_codecs_.empty() && !SetSendCodecs(channel, send_codecs_)) - return false; - return ChangeSend(channel, desired_send_); } bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); ChannelMap::iterator it = send_channels_.find(ssrc); if (it == send_channels_.end()) { LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc @@ -2171,21 +2128,15 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { delete it->second; send_channels_.erase(it); - if (IsDefaultChannel(channel)) { - // Do not delete the default channel since the receive channels depend on - // the default channel, recycle it instead. - ChangeSend(channel, SEND_NOTHING); - } else { - // Clean up and delete the send channel. - LOG(LS_INFO) << "Removing audio send stream " << ssrc - << " with VoiceEngine channel #" << channel << "."; - if (!DeleteChannel(channel)) - return false; + // Clean up and delete the send channel. + LOG(LS_INFO) << "Removing audio send stream " << ssrc + << " with VoiceEngine channel #" << channel << "."; + if (!DeleteChannel(channel)) { + return false; } - - if (send_channels_.empty()) + if (send_channels_.empty()) { ChangeSend(SEND_NOTHING); - + } return true; } @@ -2216,9 +2167,8 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { RTC_DCHECK(receive_stream_params_.find(ssrc) == receive_stream_params_.end()); // Create a new channel for receiving audio data. - int channel = engine()->CreateMediaVoiceChannel(); + int channel = CreateVoEChannel(); if (channel == -1) { - LOG_RTCERR0(CreateChannel); return false; } if (!ConfigureRecvChannel(channel)) { @@ -2242,33 +2192,20 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) { RTC_DCHECK(thread_checker_.CalledOnValidThread()); - // Configure to use external transport. - if (engine()->voe()->network()->RegisterExternalTransport( - channel, *this) == -1) { - LOG_RTCERR2(SetExternalTransport, channel, this); - return false; - } - // Use the same SSRC as our default send channel, so the RTCP reports are - // correct. - unsigned int send_ssrc = 0; - webrtc::VoERTP_RTCP* rtp = engine()->voe()->rtp(); - if (rtp->GetLocalSSRC(default_send_channel_id(), send_ssrc) == -1) { - LOG_RTCERR1(GetSendSSRC, channel); + int send_channel = GetSendChannelId(receiver_reports_ssrc_); + if (send_channel != -1) { + // Associate receive channel with first send channel (so the receive channel + // can obtain RTT from the send channel) + engine()->voe()->base()->AssociateSendChannel(channel, send_channel); + LOG(LS_INFO) << "VoiceEngine channel #" << channel + << " is associated with channel #" << send_channel << "."; + } + if (engine()->voe()->rtp()->SetLocalSSRC(channel, + receiver_reports_ssrc_) == -1) { + LOG_RTCERR1(SetLocalSSRC, channel); return false; } - if (rtp->SetLocalSSRC(channel, send_ssrc) == -1) { - LOG_RTCERR1(SetSendSSRC, channel); - return false; - } - - // Associate receive channel to default send channel (so the receive channel - // can obtain RTT from the send channel). - engine()->voe()->base()->AssociateSendChannel(channel, - default_send_channel_id()); - LOG(LS_INFO) << "VoiceEngine channel #" - << channel << " is associated with channel #" - << default_send_channel_id() << "."; // Turn off all supported codecs. int ncodecs = engine()->voe()->codec()->NumOfCodecs(); @@ -2442,6 +2379,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, int event, int duration, int flags) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); if (!dtmf_allowed_) { return false; } @@ -2450,16 +2388,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, if (flags & cricket::DF_SEND) { int channel = -1; if (ssrc == 0) { - bool default_channel_is_inuse = false; - for (const auto& ch : send_channels_) { - if (IsDefaultChannel(ch.second->channel())) { - default_channel_is_inuse = true; - break; - } - } - if (default_channel_is_inuse) { - channel = default_send_channel_id(); - } else if (!send_channels_.empty()) { + if (send_channels_.size() > 0) { channel = send_channels_.begin()->second->channel(); } } else { @@ -2577,8 +2506,8 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived( } bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) { - int channel = - (ssrc == 0) ? default_send_channel_id() : GetSendChannelId(ssrc); + RTC_DCHECK(thread_checker_.CalledOnValidThread()); + int channel = GetSendChannelId(ssrc); if (channel == -1) { LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; return false; @@ -2604,8 +2533,9 @@ bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) { } webrtc::AudioProcessing* ap = engine()->voe()->base()->audio_processing(); - if (ap) + if (ap) { ap->set_output_will_be_muted(all_muted); + } return true; } @@ -2613,7 +2543,6 @@ bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) { // SetMaxSendBitrate() in future. bool WebRtcVoiceMediaChannel::SetMaxSendBandwidth(int bps) { LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetMaxSendBandwidth."; - return SetSendBitrateInternal(bps); } @@ -2641,10 +2570,12 @@ bool WebRtcVoiceMediaChannel::SetSendBitrateInternal(int bps) { if (is_multi_rate) { // If codec is multi-rate then just set the bitrate. codec.rate = bps; - if (!SetSendCodec(codec)) { - LOG(LS_INFO) << "Failed to set codec " << codec.plname - << " to bitrate " << bps << " bps."; - return false; + for (const auto& ch : send_channels_) { + if (!SetSendCodec(ch.second->channel(), codec)) { + LOG(LS_INFO) << "Failed to set codec " << codec.plname + << " to bitrate " << bps << " bps."; + return false; + } } return true; } else { @@ -2920,18 +2851,6 @@ bool WebRtcVoiceMediaChannel::GetRedSendCodec(const AudioCodec& red_codec, return false; } -bool WebRtcVoiceMediaChannel::EnableRtcp(int channel) { - if (engine()->voe()->rtp()->SetRTCPStatus(channel, true) == -1) { - LOG_RTCERR2(SetRTCPStatus, channel, 1); - return false; - } - // TODO(juberti): Enable VQMon and RTCP XR reports, once we know what - // what we want to do with them. - // engine()->voe().EnableVQMon(default_send_channel_id(), true); - // engine()->voe().EnableRTCP_XR(default_send_channel_id(), true); - return true; -} - bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) { if (playout) { LOG(LS_INFO) << "Starting playout for channel #" << channel; diff --git a/talk/media/webrtc/webrtcvoiceengine.h b/talk/media/webrtc/webrtcvoiceengine.h index cd792bcb43..a8f3ec8511 100644 --- a/talk/media/webrtc/webrtcvoiceengine.h +++ b/talk/media/webrtc/webrtcvoiceengine.h @@ -115,9 +115,6 @@ class WebRtcVoiceEngine // Stops recording the RtcEventLog. void StopRtcEventLog(); - // Create a VoiceEngine Channel. - int CreateMediaVoiceChannel(); - private: void Construct(); void ConstructCodecs(); @@ -143,7 +140,7 @@ class WebRtcVoiceEngine void StartAecDump(const std::string& filename); void StopAecDump(); - int CreateVoiceChannel(VoEWrapper* voe); + int CreateVoEChannel(); static const int kDefaultLogSeverity = rtc::LS_WARNING; @@ -187,8 +184,6 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel, webrtc::Call* call); ~WebRtcVoiceMediaChannel() override; - int default_send_channel_id() const { return default_send_channel_id_; } - bool valid() const { return default_send_channel_id_ != -1; } const AudioOptions& options() const { return options_; } bool SetSendParameters(const AudioSendParameters& params) override; @@ -267,7 +262,6 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel, bool GetRedSendCodec(const AudioCodec& red_codec, const std::vector& all_codecs, webrtc::CodecInst* send_codec); - bool EnableRtcp(int channel); bool SetPlayout(int channel, bool playout); static Error WebRtcErrorToChannelError(int err_code); @@ -280,18 +274,13 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel, unsigned char); void SetNack(int channel, bool nack_enabled); - void SetNack(const ChannelMap& channels, bool nack_enabled); - bool SetSendCodec(const webrtc::CodecInst& send_codec); bool SetSendCodec(int channel, const webrtc::CodecInst& send_codec); bool ChangePlayout(bool playout); bool ChangeSend(SendFlags send); bool ChangeSend(int channel, SendFlags send); - void ConfigureSendChannel(int channel); bool ConfigureRecvChannel(int channel); + int CreateVoEChannel(); bool DeleteChannel(int channel); - bool IsDefaultChannel(int channel_id) const { - return channel_id == default_send_channel_id_; - } bool IsDefaultRecvStream(uint32_t ssrc) { return default_recv_ssrc_ == static_cast(ssrc); } @@ -315,7 +304,6 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel, rtc::ThreadChecker thread_checker_; WebRtcVoiceEngine* const engine_; - const int default_send_channel_id_; std::vector recv_codecs_; std::vector send_codecs_; rtc::scoped_ptr send_codec_; @@ -335,6 +323,9 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel, int64_t default_recv_ssrc_ = -1; // Volume for unsignalled stream, which may be set before the stream exists. double default_recv_volume_ = 1.0; + // SSRC to use for RTCP receiver reports; default to 1 in case of no signaled + // send streams. See: https://code.google.com/p/webrtc/issues/detail?id=4740 + uint32_t receiver_reports_ssrc_ = 1; // send_channels_ contains the channels which are being used for sending. // When the default channel (default_send_channel_id) is used for sending, it diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc index b0fc2bb8d7..85094f8de8 100644 --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc @@ -122,15 +122,15 @@ class WebRtcVoiceEngineTestFake : public testing::Test { } void SetupForMultiSendStream() { EXPECT_TRUE(SetupEngineWithSendStream()); - // Remove stream added in Setup, which is corresponding to default channel. + // Remove stream added in Setup. int default_channel_num = voe_.GetLastChannel(); uint32_t default_send_ssrc = 0u; EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc)); EXPECT_EQ(kSsrc1, default_send_ssrc); EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc)); - // Verify the default channel still exists. - EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc)); + // Verify the channel does not exist. + EXPECT_EQ(-1, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc)); } void DeliverPacket(const void* data, int len) { rtc::Buffer packet(reinterpret_cast(data), len); @@ -146,12 +146,11 @@ class WebRtcVoiceEngineTestFake : public testing::Test { channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions()); EXPECT_TRUE(channel_ != nullptr); if (caller) { - // if this is a caller, local description will be applied and add the + // If this is a caller, local description will be applied and add the // send stream. EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(kSsrc1))); } - int channel_id = voe_.GetLastChannel(); // Test we can only InsertDtmf when the other side supports telephone-event. EXPECT_TRUE(channel_->SetSendParameters(send_parameters_)); @@ -163,7 +162,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { EXPECT_TRUE(channel_->CanInsertDtmf()); if (!caller) { - // There's no active send channel yet. + // If this is callee, there's no active send channel yet. EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND)); EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(kSsrc1))); @@ -173,6 +172,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND)); // Test send + int channel_id = voe_.GetLastChannel(); EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123)); EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND)); EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123)); @@ -212,7 +212,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { } void TestSetSendRtpHeaderExtensions(const std::string& ext) { - EXPECT_TRUE(SetupEngine()); + EXPECT_TRUE(SetupEngineWithSendStream()); int channel_num = voe_.GetLastChannel(); // Ensure extensions are off by default. @@ -235,12 +235,9 @@ class WebRtcVoiceEngineTestFake : public testing::Test { EXPECT_TRUE(channel_->SetSendParameters(send_parameters_)); EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext)); - // Ensure extension is set properly on new channel. - // The first stream to occupy the default channel. + // Ensure extension is set properly on new channels. EXPECT_TRUE(channel_->AddSendStream( - cricket::StreamParams::CreateLegacy(123))); - EXPECT_TRUE(channel_->AddSendStream( - cricket::StreamParams::CreateLegacy(234))); + cricket::StreamParams::CreateLegacy(kSsrc2))); int new_channel_num = voe_.GetLastChannel(); EXPECT_NE(channel_num, new_channel_num); EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext)); @@ -321,14 +318,6 @@ TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) { EXPECT_TRUE(channel_ != nullptr); } -// Tests that we properly handle failures in CreateChannel. -TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) { - voe_.set_fail_create_channel(true); - EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); - channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions()); - EXPECT_TRUE(channel_ == nullptr); -} - // Tests that the list of supported codecs is created properly and ordered // correctly TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) { @@ -998,7 +987,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) { // Test that we can enable NACK with opus as callee. TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) { - EXPECT_TRUE(SetupEngine()); + EXPECT_TRUE(SetupEngineWithRecvStream()); int channel_num = voe_.GetLastChannel(); cricket::AudioSendParameters parameters; parameters.codecs.push_back(kOpusCodec); @@ -1011,7 +1000,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) { EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(kSsrc1))); - EXPECT_TRUE(voe_.GetNACK(channel_num)); + EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel())); } // Test that we can enable NACK on receive streams. @@ -1581,7 +1570,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) { channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions()); EXPECT_TRUE(channel_ != nullptr); - int channel_num = voe_.GetLastChannel(); cricket::AudioSendParameters parameters; parameters.codecs.push_back(kIsacCodec); parameters.codecs.push_back(kPcmuCodec); @@ -1596,6 +1584,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) { EXPECT_TRUE(channel_->SetSendParameters(parameters)); EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(kSsrc1))); + int channel_num = voe_.GetLastChannel(); webrtc::CodecInst gcodec; EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); @@ -1698,7 +1687,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) { channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions()); EXPECT_TRUE(channel_ != nullptr); - int channel_num = voe_.GetLastChannel(); cricket::AudioSendParameters parameters; parameters.codecs.push_back(kRedCodec); parameters.codecs.push_back(kIsacCodec); @@ -1709,6 +1697,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) { EXPECT_TRUE(channel_->SetSendParameters(parameters)); EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(kSsrc1))); + int channel_num = voe_.GetLastChannel(); webrtc::CodecInst gcodec; EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); EXPECT_EQ(96, gcodec.pltype); @@ -1892,8 +1881,6 @@ TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) { EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0])); // Stream should already be Removed from the send stream list. EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0])); - // But the default still exists. - EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0])); // Delete the rest of send channel streams. for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) { @@ -2416,14 +2403,20 @@ TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) { EXPECT_TRUE(channel_->RemoveRecvStream(1)); } -// Test that we properly handle failures to add a stream. -TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) { - EXPECT_TRUE(SetupEngineWithSendStream()); +// Test that we properly handle failures to add a receive stream. +TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) { + EXPECT_TRUE(SetupEngine()); voe_.set_fail_create_channel(true); - EXPECT_TRUE(channel_->SetSendParameters(send_parameters_)); EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); } +// Test that we properly handle failures to add a send stream. +TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) { + EXPECT_TRUE(SetupEngine()); + voe_.set_fail_create_channel(true); + EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2))); +} + // Test that AddRecvStream creates new stream. TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) { EXPECT_TRUE(SetupEngineWithRecvStream()); @@ -3078,9 +3071,9 @@ TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) { EXPECT_EQ(2, s->received_packets()); } -// All receive channels should be associated with the default send channel, +// All receive channels should be associated with the first send channel, // since they do not send RTCP SR. -TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) { +TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) { EXPECT_TRUE(SetupEngineWithSendStream()); EXPECT_TRUE(channel_->SetSendParameters(send_parameters_)); int default_channel = voe_.GetLastChannel();