Remove the default send channel in WVoE.
BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1364643003 Cr-Commit-Position: refs/heads/master@{#10344}
This commit is contained in:
parent
3bf69b15f4
commit
0a617e22a4
@ -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;
|
||||
|
||||
@ -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<AudioCodec>& 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<int64_t>(ssrc);
|
||||
}
|
||||
@ -315,7 +304,6 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel,
|
||||
rtc::ThreadChecker thread_checker_;
|
||||
|
||||
WebRtcVoiceEngine* const engine_;
|
||||
const int default_send_channel_id_;
|
||||
std::vector<AudioCodec> recv_codecs_;
|
||||
std::vector<AudioCodec> send_codecs_;
|
||||
rtc::scoped_ptr<webrtc::CodecInst> 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
|
||||
|
||||
@ -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<const uint8_t*>(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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user