| Index: webrtc/audio/audio_send_stream.cc
|
| diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc
|
| index 5c08c9b8a2ce7cedc52bdd7ddf278b90eba138d1..8925b042b5603a0a1641237a87e0dbf7659a7ce0 100644
|
| --- a/webrtc/audio/audio_send_stream.cc
|
| +++ b/webrtc/audio/audio_send_stream.cc
|
| @@ -35,10 +35,55 @@
|
|
|
| constexpr char kOpusCodecName[] = "opus";
|
|
|
| +// TODO(minyue): Remove |LOG_RTCERR2|.
|
| +#define LOG_RTCERR2(func, a1, a2, err) \
|
| + LOG(LS_WARNING) << "" << #func << "(" << a1 << ", " << a2 \
|
| + << ") failed, err=" << err
|
| +
|
| +// TODO(minyue): Remove |LOG_RTCERR3|.
|
| +#define LOG_RTCERR3(func, a1, a2, a3, err) \
|
| + LOG(LS_WARNING) << "" << #func << "(" << a1 << ", " << a2 << ", " << a3 \
|
| + << ") failed, err=" << err
|
| +
|
| +std::string ToString(const webrtc::CodecInst& codec) {
|
| + std::stringstream ss;
|
| + ss << codec.plname << "/" << codec.plfreq << "/" << codec.channels << " ("
|
| + << codec.pltype << ")";
|
| + return ss.str();
|
| +}
|
| +
|
| bool IsCodec(const webrtc::CodecInst& codec, const char* ref_name) {
|
| return (_stricmp(codec.plname, ref_name) == 0);
|
| }
|
| +
|
| } // namespace
|
| +
|
| +std::string AudioSendStream::Config::Rtp::ToString() const {
|
| + std::stringstream ss;
|
| + ss << "{ssrc: " << ssrc;
|
| + ss << ", extensions: [";
|
| + for (size_t i = 0; i < extensions.size(); ++i) {
|
| + ss << extensions[i].ToString();
|
| + if (i != extensions.size() - 1) {
|
| + ss << ", ";
|
| + }
|
| + }
|
| + ss << ']';
|
| + ss << ", nack: " << nack.ToString();
|
| + ss << ", c_name: " << c_name;
|
| + ss << '}';
|
| + return ss.str();
|
| +}
|
| +
|
| +std::string AudioSendStream::Config::ToString() const {
|
| + std::stringstream ss;
|
| + ss << "{rtp: " << rtp.ToString();
|
| + ss << ", voe_channel_id: " << voe_channel_id;
|
| + // TODO(solenberg): Encoder config.
|
| + ss << ", cng_payload_type: " << send_codec_spec.cng_payload_type;
|
| + ss << '}';
|
| + return ss.str();
|
| +}
|
|
|
| namespace internal {
|
| AudioSendStream::AudioSendStream(
|
| @@ -288,8 +333,11 @@
|
|
|
| const auto& send_codec_spec = config_.send_codec_spec;
|
|
|
| - // We set the codec first, since the below extra configuration is only applied
|
| - // to the "current" codec.
|
| + // Set the codec immediately, since SetVADStatus() depends on whether
|
| + // the current codec is mono or stereo.
|
| + LOG(LS_INFO) << "Send channel " << channel << " selected voice codec "
|
| + << ToString(send_codec_spec.codec_inst)
|
| + << ", bitrate=" << send_codec_spec.codec_inst.rate;
|
|
|
| // If codec is already configured, we do not it again.
|
| // TODO(minyue): check if this check is really needed, or can we move it into
|
| @@ -298,33 +346,47 @@
|
| if (codec->GetSendCodec(channel, current_codec) != 0 ||
|
| (send_codec_spec.codec_inst != current_codec)) {
|
| if (codec->SetSendCodec(channel, send_codec_spec.codec_inst) == -1) {
|
| - LOG(LS_WARNING) << "SetSendCodec() failed: " << base->LastError();
|
| + LOG_RTCERR2(SetSendCodec, channel, ToString(send_codec_spec.codec_inst),
|
| + base->LastError());
|
| return false;
|
| }
|
| }
|
|
|
| - // Codec internal FEC. Treat any failure as fatal internal error.
|
| + // FEC should be enabled after SetSendCodec.
|
| if (send_codec_spec.enable_codec_fec) {
|
| - if (codec->SetFECStatus(channel, true) != 0) {
|
| - LOG(LS_WARNING) << "SetFECStatus() failed: " << base->LastError();
|
| + LOG(LS_INFO) << "Attempt to enable codec internal FEC on channel "
|
| + << channel;
|
| + if (codec->SetFECStatus(channel, true) == -1) {
|
| + // Enable codec internal FEC. Treat any failure as fatal internal error.
|
| + LOG_RTCERR2(SetFECStatus, channel, true, base->LastError());
|
| return false;
|
| }
|
| }
|
|
|
| - // DTX and maxplaybackrate are only set if current codec is Opus.
|
| if (IsCodec(send_codec_spec.codec_inst, kOpusCodecName)) {
|
| - if (codec->SetOpusDtx(channel, send_codec_spec.enable_opus_dtx) != 0) {
|
| - LOG(LS_WARNING) << "SetOpusDtx() failed: " << base->LastError();
|
| + // DTX and maxplaybackrate should be set after SetSendCodec. Because current
|
| + // send codec has to be Opus.
|
| +
|
| + // Set Opus internal DTX.
|
| + LOG(LS_INFO) << "Attempt to "
|
| + << (send_codec_spec.enable_opus_dtx ? "enable" : "disable")
|
| + << " Opus DTX on channel " << channel;
|
| + if (codec->SetOpusDtx(channel, send_codec_spec.enable_opus_dtx)) {
|
| + LOG_RTCERR2(SetOpusDtx, channel, send_codec_spec.enable_opus_dtx,
|
| + base->LastError());
|
| return false;
|
| }
|
|
|
| // If opus_max_playback_rate <= 0, the default maximum playback rate
|
| // (48 kHz) will be used.
|
| if (send_codec_spec.opus_max_playback_rate > 0) {
|
| + LOG(LS_INFO) << "Attempt to set maximum playback rate to "
|
| + << send_codec_spec.opus_max_playback_rate
|
| + << " Hz on channel " << channel;
|
| if (codec->SetOpusMaxPlaybackRate(
|
| - channel, send_codec_spec.opus_max_playback_rate) != 0) {
|
| - LOG(LS_WARNING) << "SetOpusMaxPlaybackRate() failed: "
|
| - << base->LastError();
|
| + channel, send_codec_spec.opus_max_playback_rate) == -1) {
|
| + LOG_RTCERR2(SetOpusMaxPlaybackRate, channel,
|
| + send_codec_spec.opus_max_playback_rate, base->LastError());
|
| return false;
|
| }
|
| }
|
| @@ -347,9 +409,11 @@
|
| return false;
|
| }
|
| if (codec->SetSendCNPayloadType(channel, send_codec_spec.cng_payload_type,
|
| - cn_freq) != 0) {
|
| - LOG(LS_WARNING) << "SetSendCNPayloadType() failed: "
|
| - << base->LastError();
|
| + cn_freq) == -1) {
|
| + LOG_RTCERR3(SetSendCNPayloadType, channel,
|
| + send_codec_spec.cng_payload_type, cn_freq,
|
| + base->LastError());
|
| +
|
| // TODO(ajm): This failure condition will be removed from VoE.
|
| // Restore the return here when we update to a new enough webrtc.
|
| //
|
| @@ -367,8 +431,9 @@
|
| send_codec_spec.codec_inst.channels == 1) {
|
| // TODO(minyue): If CN frequency == 48000 Hz is allowed, consider the
|
| // interaction between VAD and Opus FEC.
|
| - if (codec->SetVADStatus(channel, true) != 0) {
|
| - LOG(LS_WARNING) << "SetVADStatus() failed: " << base->LastError();
|
| + LOG(LS_INFO) << "Enabling VAD";
|
| + if (codec->SetVADStatus(channel, true) == -1) {
|
| + LOG_RTCERR2(SetVADStatus, channel, true, base->LastError());
|
| return false;
|
| }
|
| }
|
|
|