From d97ec30ce4f22ba2d88314d67ff44458144a5096 Mon Sep 17 00:00:00 2001 From: solenberg Date: Wed, 7 Oct 2015 01:40:33 -0700 Subject: [PATCH] Remove default receive channel from WVoE; baby step 0. Cleanup + add thread checker DCHECKs to various method in WebRtcVoiceEngine/MediaChannel. BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1386653002 Cr-Commit-Position: refs/heads/master@{#10194} --- talk/media/webrtc/webrtcvideoengine2.cc | 4 - .../webrtc/webrtcvideoengine2_unittest.cc | 4 - talk/media/webrtc/webrtcvoiceengine.cc | 204 ++++++++---------- talk/media/webrtc/webrtcvoiceengine.h | 12 +- .../webrtc/webrtcvoiceengine_unittest.cc | 12 +- 5 files changed, 94 insertions(+), 142 deletions(-) diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc index 2f0634043d..c53dac8561 100644 --- a/talk/media/webrtc/webrtcvideoengine2.cc +++ b/talk/media/webrtc/webrtcvideoengine2.cc @@ -51,10 +51,6 @@ #include "webrtc/video_decoder.h" #include "webrtc/video_encoder.h" -#define UNIMPLEMENTED \ - LOG(LS_ERROR) << "Call to unimplemented function " << __FUNCTION__; \ - RTC_NOTREACHED() - namespace cricket { namespace { diff --git a/talk/media/webrtc/webrtcvideoengine2_unittest.cc b/talk/media/webrtc/webrtcvideoengine2_unittest.cc index 3c187b3702..63130b023e 100644 --- a/talk/media/webrtc/webrtcvideoengine2_unittest.cc +++ b/talk/media/webrtc/webrtcvideoengine2_unittest.cc @@ -908,10 +908,6 @@ class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test { } protected: - virtual std::vector GetCodecs() { - return engine_.codecs(); - } - FakeVideoSendStream* AddSendStream() { return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_)); } diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc index 40d8442405..05b98ec154 100644 --- a/talk/media/webrtc/webrtcvoiceengine.cc +++ b/talk/media/webrtc/webrtcvoiceengine.cc @@ -54,8 +54,9 @@ #include "webrtc/modules/audio_processing/include/audio_processing.h" namespace cricket { +namespace { -static const int kMaxNumPacketSize = 6; +const int kMaxNumPacketSize = 6; struct CodecPref { const char* name; int clockrate; @@ -65,7 +66,7 @@ struct CodecPref { int packet_sizes_ms[kMaxNumPacketSize]; }; // Note: keep the supported packet sizes in ascending order. -static const CodecPref kCodecPrefs[] = { +const CodecPref kCodecPrefs[] = { { kOpusCodecName, 48000, 2, 111, true, { 10, 20, 40, 60 } }, { kIsacCodecName, 16000, 1, 103, true, { 30, 60 } }, { kIsacCodecName, 32000, 1, 104, true, { 30 } }, @@ -97,14 +98,14 @@ static const CodecPref kCodecPrefs[] = { // It's not clear yet whether the -2 index is handled properly on other OSes. #ifdef WIN32 -static const int kDefaultAudioDeviceId = -1; +const int kDefaultAudioDeviceId = -1; #else -static const int kDefaultAudioDeviceId = 0; +const int kDefaultAudioDeviceId = 0; #endif // Parameter used for NACK. // This value is equivalent to 5 seconds of audio data at 20 ms per packet. -static const int kNackMaxPackets = 250; +const int kNackMaxPackets = 250; // Codec parameters for Opus. // draft-spittka-payload-rtp-opus-03 @@ -117,18 +118,18 @@ static const int kNackMaxPackets = 250; // 64-128 kb/s for FB stereo music. // The current implementation applies the following values to mono signals, // and multiplies them by 2 for stereo. -static const int kOpusBitrateNb = 12000; -static const int kOpusBitrateWb = 20000; -static const int kOpusBitrateFb = 32000; +const int kOpusBitrateNb = 12000; +const int kOpusBitrateWb = 20000; +const int kOpusBitrateFb = 32000; // Opus bitrate should be in the range between 6000 and 510000. -static const int kOpusMinBitrate = 6000; -static const int kOpusMaxBitrate = 510000; +const int kOpusMinBitrate = 6000; +const int kOpusMaxBitrate = 510000; // Default audio dscp value. // See http://tools.ietf.org/html/rfc2474 for details. // See also http://tools.ietf.org/html/draft-jennings-rtcweb-qos-00 -static const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF; +const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF; // Ensure we open the file in a writeable path on ChromeOS and Android. This // workaround can be removed when it's possible to specify a filename for audio @@ -140,29 +141,29 @@ static const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF; // NOTE(ajm): Don't use hardcoded paths on platforms not explicitly specified // below. #if defined(CHROMEOS) -static const char kAecDumpByAudioOptionFilename[] = "/tmp/audio.aecdump"; +const char kAecDumpByAudioOptionFilename[] = "/tmp/audio.aecdump"; #elif defined(ANDROID) -static const char kAecDumpByAudioOptionFilename[] = "/sdcard/audio.aecdump"; +const char kAecDumpByAudioOptionFilename[] = "/sdcard/audio.aecdump"; #else -static const char kAecDumpByAudioOptionFilename[] = "audio.aecdump"; +const char kAecDumpByAudioOptionFilename[] = "audio.aecdump"; #endif // Dumps an AudioCodec in RFC 2327-ish format. -static std::string ToString(const AudioCodec& codec) { +std::string ToString(const AudioCodec& codec) { std::stringstream ss; ss << codec.name << "/" << codec.clockrate << "/" << codec.channels << " (" << codec.id << ")"; return ss.str(); } -static std::string ToString(const webrtc::CodecInst& codec) { +std::string ToString(const webrtc::CodecInst& codec) { std::stringstream ss; ss << codec.plname << "/" << codec.plfreq << "/" << codec.channels << " (" << codec.pltype << ")"; return ss.str(); } -static void LogMultiline(rtc::LoggingSeverity sev, char* text) { +void LogMultiline(rtc::LoggingSeverity sev, char* text) { const char* delim = "\r\n"; for (char* tok = strtok(text, delim); tok; tok = strtok(NULL, delim)) { LOG_V(sev) << tok; @@ -170,7 +171,7 @@ static void LogMultiline(rtc::LoggingSeverity sev, char* text) { } // Severity is an integer because it comes is assumed to be from command line. -static int SeverityToFilter(int severity) { +int SeverityToFilter(int severity) { int filter = webrtc::kTraceNone; switch (severity) { case rtc::LS_VERBOSE: @@ -188,15 +189,15 @@ static int SeverityToFilter(int severity) { return filter; } -static bool IsCodec(const AudioCodec& codec, const char* ref_name) { +bool IsCodec(const AudioCodec& codec, const char* ref_name) { return (_stricmp(codec.name.c_str(), ref_name) == 0); } -static bool IsCodec(const webrtc::CodecInst& codec, const char* ref_name) { +bool IsCodec(const webrtc::CodecInst& codec, const char* ref_name) { return (_stricmp(codec.plname, ref_name) == 0); } -static bool IsCodecMultiRate(const webrtc::CodecInst& codec) { +bool IsCodecMultiRate(const webrtc::CodecInst& codec) { for (size_t i = 0; i < ARRAY_SIZE(kCodecPrefs); ++i) { if (IsCodec(codec, kCodecPrefs[i].name) && kCodecPrefs[i].clockrate == codec.plfreq) { @@ -206,7 +207,7 @@ static bool IsCodecMultiRate(const webrtc::CodecInst& codec) { return false; } -static bool FindCodec(const std::vector& codecs, +bool FindCodec(const std::vector& codecs, const AudioCodec& codec, AudioCodec* found_codec) { for (const AudioCodec& c : codecs) { @@ -220,12 +221,12 @@ static bool FindCodec(const std::vector& codecs, return false; } -static bool IsNackEnabled(const AudioCodec& codec) { +bool IsNackEnabled(const AudioCodec& codec) { return codec.HasFeedbackParam(FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)); } -static int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) { +int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) { int selected_packet_size_ms = codec_pref.packet_sizes_ms[0]; for (int packet_size_ms : codec_pref.packet_sizes_ms) { if (packet_size_ms && packet_size_ms <= ptime_ms) { @@ -238,7 +239,7 @@ static int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) { // If the AudioCodec param kCodecParamPTime is set, then we will set it to codec // pacsize if it's valid, or we will pick the next smallest value we support. // TODO(Brave): Query supported packet sizes from ACM when the API is ready. -static bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) { +bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) { for (const CodecPref& codec_pref : kCodecPrefs) { if ((IsCodec(*codec, codec_pref.name) && codec_pref.clockrate == codec->plfreq) || @@ -255,7 +256,7 @@ static bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) { } // Return true if codec.params[feature] == "1", false otherwise. -static bool IsCodecFeatureEnabled(const AudioCodec& codec, +bool IsCodecFeatureEnabled(const AudioCodec& codec, const char* feature) { int value; return codec.GetParam(feature, &value) && value == 1; @@ -265,7 +266,7 @@ static bool IsCodecFeatureEnabled(const AudioCodec& codec, // otherwise. If the value (either from params or codec.bitrate) <=0, use the // default configuration. If the value is beyond feasible bit rate of Opus, // clamp it. Returns the Opus bit rate for operation. -static int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) { +int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) { int bitrate = 0; bool use_param = true; if (!codec.GetParam(kCodecParamMaxAverageBitrate, &bitrate)) { @@ -298,7 +299,7 @@ static int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) { // Returns kOpusDefaultPlaybackRate if params[kCodecParamMaxPlaybackRate] is not // defined. Returns the value of params[kCodecParamMaxPlaybackRate] otherwise. -static int GetOpusMaxPlaybackRate(const AudioCodec& codec) { +int GetOpusMaxPlaybackRate(const AudioCodec& codec) { int value; if (codec.GetParam(kCodecParamMaxPlaybackRate, &value)) { return value; @@ -306,7 +307,7 @@ static int GetOpusMaxPlaybackRate(const AudioCodec& codec) { return kOpusDefaultMaxPlaybackRate; } -static void GetOpusConfig(const AudioCodec& codec, webrtc::CodecInst* voe_codec, +void GetOpusConfig(const AudioCodec& codec, webrtc::CodecInst* voe_codec, bool* enable_codec_fec, int* max_playback_rate, bool* enable_codec_dtx) { *enable_codec_fec = IsCodecFeatureEnabled(codec, kCodecParamUseInbandFec); @@ -326,7 +327,7 @@ static void GetOpusConfig(const AudioCodec& codec, webrtc::CodecInst* voe_codec, // Changes RTP timestamp rate of G722. This is due to the "bug" in the RFC // which says that G722 should be advertised as 8 kHz although it is a 16 kHz // codec. -static void MaybeFixupG722(webrtc::CodecInst* voe_codec, int new_plfreq) { +void MaybeFixupG722(webrtc::CodecInst* voe_codec, int new_plfreq) { if (IsCodec(*voe_codec, kG722CodecName)) { // If the ASSERT triggers, the codec definition in WebRTC VoiceEngine // has changed, and this special case is no longer needed. @@ -338,7 +339,7 @@ static void MaybeFixupG722(webrtc::CodecInst* voe_codec, int new_plfreq) { // Gets the default set of options applied to the engine. Historically, these // were supplied as a combination of flags from the channel manager (ec, agc, // ns, and highpass) and the rest hardcoded in InitInternal. -static AudioOptions GetDefaultEngineOptions() { +AudioOptions GetDefaultEngineOptions() { AudioOptions options; options.echo_cancellation.Set(true); options.auto_gain_control.Set(true); @@ -358,9 +359,10 @@ static AudioOptions GetDefaultEngineOptions() { return options; } -static std::string GetEnableString(bool enable) { +std::string GetEnableString(bool enable) { return enable ? "enable" : "disable"; } +} // namespace { WebRtcVoiceEngine::WebRtcVoiceEngine() : voe_wrapper_(new VoEWrapper()), @@ -862,18 +864,6 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { return true; } -struct ResumeEntry { - ResumeEntry(WebRtcVoiceMediaChannel *c, bool p, SendFlags s) - : channel(c), - playout(p), - send(s) { - } - - WebRtcVoiceMediaChannel *channel; - bool playout; - SendFlags send; -}; - // TODO(juberti): Refactor this so that the core logic can be used to set the // soundclip device. At that time, reinstate the soundclip pause/resume code. bool WebRtcVoiceEngine::SetDevices(const Device* in_device, @@ -1186,40 +1176,18 @@ void WebRtcVoiceEngine::Print(webrtc::TraceLevel level, const char* trace, } } -void WebRtcVoiceEngine::CallbackOnError(int channel_num, int err_code) { - rtc::CritScope lock(&channels_cs_); - WebRtcVoiceMediaChannel* channel = NULL; - uint32 ssrc = 0; +void WebRtcVoiceEngine::CallbackOnError(int channel_id, int err_code) { + RTC_DCHECK(channel_id == -1); LOG(LS_WARNING) << "VoiceEngine error " << err_code << " reported on channel " - << channel_num << "."; - if (FindChannelAndSsrc(channel_num, &channel, &ssrc)) { - RTC_DCHECK(channel != NULL); - channel->OnError(ssrc, err_code); - } else { - LOG(LS_ERROR) << "VoiceEngine channel " << channel_num - << " could not be found in channel list when error reported."; + << channel_id << "."; + rtc::CritScope lock(&channels_cs_); + for (WebRtcVoiceMediaChannel* channel : channels_) { + channel->OnError(err_code); } } -bool WebRtcVoiceEngine::FindChannelAndSsrc( - int channel_num, WebRtcVoiceMediaChannel** channel, uint32* ssrc) const { - RTC_DCHECK(channel != NULL && ssrc != NULL); - - *channel = NULL; - *ssrc = 0; - // Find corresponding channel and ssrc - for (WebRtcVoiceMediaChannel* ch : channels_) { - RTC_DCHECK(ch != NULL); - if (ch->FindSsrc(channel_num, ssrc)) { - *channel = ch; - return true; - } - } - - return false; -} - void WebRtcVoiceEngine::RegisterChannel(WebRtcVoiceMediaChannel* channel) { + RTC_DCHECK(channel != NULL); rtc::CritScope lock(&channels_cs_); channels_.push_back(channel); } @@ -1416,6 +1384,7 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, send_(SEND_NOTHING), call_(call), default_receive_ssrc_(0) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); engine->RegisterChannel(this); LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel " << voe_channel(); @@ -1425,16 +1394,19 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, } WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel " << voe_channel(); // Remove any remaining send streams, the default channel will be deleted // later. - while (!send_channels_.empty()) + while (!send_channels_.empty()) { RemoveSendStream(send_channels_.begin()->first); + } // Unregister ourselves from the engine. engine()->UnregisterChannel(this); + // Remove any remaining streams. while (!receive_channels_.empty()) { RemoveRecvStream(receive_channels_.begin()->first); @@ -1447,6 +1419,7 @@ WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { bool WebRtcVoiceMediaChannel::SetSendParameters( const AudioSendParameters& params) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); // TODO(pthatcher): Refactor this to be more clean now that we have // all the information at once. return (SetSendCodecs(params.codecs) && @@ -1457,6 +1430,7 @@ bool WebRtcVoiceMediaChannel::SetSendParameters( bool WebRtcVoiceMediaChannel::SetRecvParameters( const AudioRecvParameters& params) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); // TODO(pthatcher): Refactor this to be more clean now that we have // all the information at once. return (SetRecvCodecs(params.codecs) && @@ -1464,6 +1438,7 @@ bool WebRtcVoiceMediaChannel::SetRecvParameters( } bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); LOG(LS_INFO) << "Setting voice channel options: " << options.ToString(); @@ -1553,6 +1528,7 @@ bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) { bool WebRtcVoiceMediaChannel::SetRecvCodecs( const std::vector& codecs) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); // Set the payload types to be used for incoming media. LOG(LS_INFO) << "Setting receive voice codecs:"; @@ -1804,6 +1780,8 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( bool WebRtcVoiceMediaChannel::SetSendCodecs( const std::vector& codecs) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); + dtmf_allowed_ = false; for (const AudioCodec& codec : codecs) { // Find the DTMF telephone event "codec". @@ -1875,6 +1853,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodec( bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions( const std::vector& extensions) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); if (receive_extensions_ == extensions) { return true; } @@ -1942,6 +1921,7 @@ bool WebRtcVoiceMediaChannel::SetChannelRecvRtpHeaderExtensions( bool WebRtcVoiceMediaChannel::SetSendRtpHeaderExtensions( const std::vector& extensions) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); if (send_extensions_ == extensions) { return true; } @@ -2000,6 +1980,7 @@ bool WebRtcVoiceMediaChannel::ResumePlayout() { } bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); if (playout_ == playout) { return true; } @@ -2088,6 +2069,7 @@ bool WebRtcVoiceMediaChannel::ChangeSend(int channel, SendFlags send) { bool WebRtcVoiceMediaChannel::SetAudioSend(uint32 ssrc, bool enable, const AudioOptions* options, AudioRenderer* renderer) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); // TODO(solenberg): The state change should be fully rolled back if any one of // these calls fail. if (!SetLocalRenderer(ssrc, renderer)) { @@ -2133,9 +2115,10 @@ bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) { } 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 = GetSendChannelNum(sp.first_ssrc()); + int channel = GetSendChannelId(sp.first_ssrc()); if (channel != -1) { LOG(LS_ERROR) << "Stream already exists with ssrc " << sp.first_ssrc(); return false; @@ -2243,6 +2226,8 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32 ssrc) { bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { RTC_DCHECK(thread_checker_.CalledOnValidThread()); + LOG(LS_INFO) << "AddRecvStream: " << sp.ToString(); + rtc::CritScope lock(&receive_channels_cs_); if (!VERIFY(sp.ssrcs.size() == 1)) @@ -2301,6 +2286,7 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { } bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); // Configure to use external transport, like our default channel. if (engine()->voe()->network()->RegisterExternalTransport( channel, *this) == -1) { @@ -2373,6 +2359,8 @@ bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) { bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) { RTC_DCHECK(thread_checker_.CalledOnValidThread()); + LOG(LS_INFO) << "RemoveRecvStream: " << ssrc; + rtc::CritScope lock(&receive_channels_cs_); ChannelMap::iterator it = receive_channels_.find(ssrc); if (it == receive_channels_.end()) { @@ -2431,6 +2419,7 @@ bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) { bool WebRtcVoiceMediaChannel::SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); ChannelMap::iterator it = receive_channels_.find(ssrc); if (it == receive_channels_.end()) { if (renderer) { @@ -2475,6 +2464,7 @@ bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32 ssrc, bool WebRtcVoiceMediaChannel::GetActiveStreams( AudioInfo::StreamList* actives) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); // In conference mode, the default channel should not be in // |receive_channels_|. actives->clear(); @@ -2488,6 +2478,7 @@ bool WebRtcVoiceMediaChannel::GetActiveStreams( } int WebRtcVoiceMediaChannel::GetOutputLevel() { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); // return the highest output level of all streams int highest = GetOutputLevel(voe_channel()); for (const auto& ch : receive_channels_) { @@ -2524,6 +2515,7 @@ void WebRtcVoiceMediaChannel::SetTypingDetectionParameters(int time_window, bool WebRtcVoiceMediaChannel::SetOutputScaling( uint32 ssrc, double left, double right) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); rtc::CritScope lock(&receive_channels_cs_); // Collect the channels to scale the output volume. std::vector channels; @@ -2536,7 +2528,7 @@ bool WebRtcVoiceMediaChannel::SetOutputScaling( channels.push_back(ch.second->channel()); } } else { // Collect only the channel of the specified ssrc. - int channel = GetReceiveChannelNum(ssrc); + int channel = GetReceiveChannelId(ssrc); if (-1 == channel) { LOG(LS_WARNING) << "Cannot find channel for ssrc:" << ssrc; return false; @@ -2597,7 +2589,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32 ssrc, int event, channel = send_channels_.begin()->second->channel(); } } else { - channel = GetSendChannelNum(ssrc); + channel = GetSendChannelId(ssrc); } if (channel == -1) { LOG(LS_WARNING) << "InsertDtmf - The specified ssrc " @@ -2639,7 +2631,7 @@ void WebRtcVoiceMediaChannel::OnPacketReceived( // any multiplexed streams, just send it to the default channel. Otherwise, // send it to the specific decoder instance for that stream. int which_channel = - GetReceiveChannelNum(ParseSsrc(packet->data(), packet->size(), false)); + GetReceiveChannelId(ParseSsrc(packet->data(), packet->size(), false)); if (which_channel == -1) { which_channel = voe_channel(); } @@ -2675,7 +2667,7 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived( bool has_sent_to_default_channel = false; if (type == kRtcpTypeSR) { int which_channel = - GetReceiveChannelNum(ParseSsrc(packet->data(), packet->size(), true)); + GetReceiveChannelId(ParseSsrc(packet->data(), packet->size(), true)); if (which_channel != -1) { engine()->voe()->network()->ReceivedRTCPPacket( which_channel, packet->data(), packet->size()); @@ -2700,7 +2692,7 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived( } bool WebRtcVoiceMediaChannel::MuteStream(uint32 ssrc, bool muted) { - int channel = (ssrc == 0) ? voe_channel() : GetSendChannelNum(ssrc); + int channel = (ssrc == 0) ? voe_channel() : GetSendChannelId(ssrc); if (channel == -1) { LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; return false; @@ -2784,6 +2776,8 @@ bool WebRtcVoiceMediaChannel::SetSendBitrateInternal(int bps) { } bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); + bool echo_metrics_on = false; // These can take on valid negative values, so use the lowest possible level // as default rather than -1. @@ -2970,42 +2964,10 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) { return true; } -bool WebRtcVoiceMediaChannel::FindSsrc(int channel_num, uint32* ssrc) { - rtc::CritScope lock(&receive_channels_cs_); - RTC_DCHECK(ssrc != NULL); - if (channel_num == -1 && send_ != SEND_NOTHING) { - // Sometimes the VoiceEngine core will throw error with channel_num = -1. - // This means the error is not limited to a specific channel. Signal the - // message using ssrc=0. If the current channel is sending, use this - // channel for sending the message. - *ssrc = 0; - return true; - } else { - // Check whether this is a sending channel. - for (const auto& ch : send_channels_) { - if (ch.second->channel() == channel_num) { - // This is a sending channel. - uint32 local_ssrc = 0; - if (engine()->voe()->rtp()->GetLocalSSRC( - channel_num, local_ssrc) != -1) { - *ssrc = local_ssrc; - } - return true; - } - } - - // Check whether this is a receiving channel. - for (const auto& ch : receive_channels_) { - if (ch.second->channel() == channel_num) { - *ssrc = ch.first; - return true; - } - } +void WebRtcVoiceMediaChannel::OnError(int error) { + if (send_ == SEND_NOTHING) { + return; } - return false; -} - -void WebRtcVoiceMediaChannel::OnError(uint32 ssrc, int error) { if (error == VE_TYPING_NOISE_WARNING) { typing_noise_detected_ = true; } else if (error == VE_TYPING_NOISE_OFF_WARNING) { @@ -3014,20 +2976,21 @@ void WebRtcVoiceMediaChannel::OnError(uint32 ssrc, int error) { } int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) { - unsigned int ulevel; - int ret = - engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel); + unsigned int ulevel = 0; + int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel); return (ret == 0) ? static_cast(ulevel) : -1; } -int WebRtcVoiceMediaChannel::GetReceiveChannelNum(uint32 ssrc) const { +int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32 ssrc) const { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); ChannelMap::const_iterator it = receive_channels_.find(ssrc); if (it != receive_channels_.end()) return it->second->channel(); return (ssrc == default_receive_ssrc_) ? voe_channel() : -1; } -int WebRtcVoiceMediaChannel::GetSendChannelNum(uint32 ssrc) const { +int WebRtcVoiceMediaChannel::GetSendChannelId(uint32 ssrc) const { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); ChannelMap::const_iterator it = send_channels_.find(ssrc); if (it != send_channels_.end()) return it->second->channel(); @@ -3219,6 +3182,7 @@ void WebRtcVoiceMediaChannel::RemoveAudioReceiveStream(uint32 ssrc) { bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal( const std::vector& new_codecs) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); for (const AudioCodec& codec : new_codecs) { webrtc::CodecInst voe_codec; if (engine()->FindWebRtcCodec(codec, &voe_codec)) { diff --git a/talk/media/webrtc/webrtcvoiceengine.h b/talk/media/webrtc/webrtcvoiceengine.h index 69e88e44c4..61dc7b16e1 100644 --- a/talk/media/webrtc/webrtcvoiceengine.h +++ b/talk/media/webrtc/webrtcvoiceengine.h @@ -127,15 +127,12 @@ class WebRtcVoiceEngine void Print(webrtc::TraceLevel level, const char* trace, int length) override; // webrtc::VoiceEngineObserver: - void CallbackOnError(int channel, int errCode) override; + void CallbackOnError(int channel_id, int errCode) override; // Given the device type, name, and id, find device id. Return true and // set the output parameter rtc_id if successful. bool FindWebRtcAudioDeviceId( bool is_input, const std::string& dev_name, int dev_id, int* rtc_id); - bool FindChannelAndSsrc(int channel_num, - WebRtcVoiceMediaChannel** channel, - uint32* ssrc) const; void StartAecDump(const std::string& filename); void StopAecDump(); @@ -237,11 +234,10 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel, return VoiceMediaChannel::SendRtcp(&packet); } - bool FindSsrc(int channel_num, uint32* ssrc); - void OnError(uint32 ssrc, int error); + void OnError(int error); - int GetReceiveChannelNum(uint32 ssrc) const; - int GetSendChannelNum(uint32 ssrc) const; + int GetReceiveChannelId(uint32 ssrc) const; + int GetSendChannelId(uint32 ssrc) const; private: bool SetSendCodecs(const std::vector& codecs); diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc index 0a72783c7a..8a03b24209 100644 --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc @@ -2866,23 +2866,23 @@ TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) { EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp()); } -// Test that GetReceiveChannelNum returns the default channel for the first +// Test that GetReceiveChannelId returns the default channel for the first // recv stream in 1-1 calls. -TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelNumIn1To1Calls) { +TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelIdIn1To1Calls) { EXPECT_TRUE(SetupEngine()); cricket::WebRtcVoiceMediaChannel* media_channel = static_cast(channel_); // Test that GetChannelNum returns the default channel if the SSRC is unknown. EXPECT_EQ(media_channel->voe_channel(), - media_channel->GetReceiveChannelNum(0)); + media_channel->GetReceiveChannelId(0)); cricket::StreamParams stream; stream.ssrcs.push_back(kSsrc2); EXPECT_TRUE(channel_->AddRecvStream(stream)); EXPECT_EQ(media_channel->voe_channel(), - media_channel->GetReceiveChannelNum(kSsrc2)); + media_channel->GetReceiveChannelId(kSsrc2)); } -// Test that GetReceiveChannelNum doesn't return the default channel for the +// Test that GetReceiveChannelId doesn't return the default channel for the // first recv stream in conference calls. TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) { EXPECT_TRUE(SetupEngine()); @@ -2894,7 +2894,7 @@ TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) { cricket::WebRtcVoiceMediaChannel* media_channel = static_cast(channel_); EXPECT_LT(media_channel->voe_channel(), - media_channel->GetReceiveChannelNum(kSsrc2)); + media_channel->GetReceiveChannelId(kSsrc2)); } TEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) {