(Auto)update libjingle 70422491-> 70424781
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6586 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/media/webrtc/fakewebrtcvoiceengine.h b/talk/media/webrtc/fakewebrtcvoiceengine.h
index e3b7537..5ceaf93 100644
--- a/talk/media/webrtc/fakewebrtcvoiceengine.h
+++ b/talk/media/webrtc/fakewebrtcvoiceengine.h
@@ -539,6 +539,11 @@
#ifdef USE_WEBRTC_DEV_BRANCH
WEBRTC_FUNC(SetFECStatus, (int channel, bool enable)) {
WEBRTC_CHECK_CHANNEL(channel);
+ if (strcmp(channels_[channel]->send_codec.plname, "opus")) {
+ // Return -1 if current send codec is not Opus.
+ // TODO(minyue): Excludes other codecs if they support inband FEC.
+ return -1;
+ }
channels_[channel]->codec_fec = enable;
return 0;
}
diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc
index 7df4788..10115d4 100644
--- a/talk/media/webrtc/webrtcvoiceengine.cc
+++ b/talk/media/webrtc/webrtcvoiceengine.cc
@@ -1985,6 +1985,7 @@
memset(&send_codec, 0, sizeof(send_codec));
bool nack_enabled = nack_enabled_;
+ bool enable_codec_fec = false;
// Set send codec (the first non-telephone-event/CN codec)
for (std::vector<AudioCodec>::const_iterator it = codecs.begin();
@@ -2035,19 +2036,6 @@
if (bitrate_from_params != 0) {
voe_codec.rate = bitrate_from_params;
}
-
- // For Opus, we also enable inband FEC if it is requested.
- if (IsOpusFecEnabled(*it)) {
- LOG(LS_INFO) << "Enabling Opus FEC on channel " << channel;
-#ifdef USE_WEBRTC_DEV_BRANCH
- if (engine()->voe()->codec()->SetFECStatus(channel, true) == -1) {
- // Enable in-band FEC of the Opus codec. Treat any failure as a fatal
- // internal error.
- LOG_RTCERR2(SetFECStatus, channel, true);
- return false;
- }
-#endif // USE_WEBRTC_DEV_BRANCH
- }
}
// We'll use the first codec in the list to actually send audio data.
@@ -2078,6 +2066,8 @@
} else {
send_codec = voe_codec;
nack_enabled = IsNackEnabled(*it);
+ // For Opus as the send codec, we enable inband FEC if requested.
+ enable_codec_fec = IsOpus(*it) && IsOpusFecEnabled(*it);
}
found_send_codec = true;
break;
@@ -2098,6 +2088,19 @@
if (!SetSendCodec(channel, send_codec))
return false;
+ // FEC should be enabled after SetSendCodec.
+ if (enable_codec_fec) {
+ LOG(LS_INFO) << "Attempt to enable codec internal FEC on channel "
+ << channel;
+#ifdef USE_WEBRTC_DEV_BRANCH
+ if (engine()->voe()->codec()->SetFECStatus(channel, true) == -1) {
+ // Enable codec internal FEC. Treat any failure as fatal internal error.
+ LOG_RTCERR2(SetFECStatus, channel, true);
+ return false;
+ }
+#endif // USE_WEBRTC_DEV_BRANCH
+ }
+
// Always update the |send_codec_| to the currently set send codec.
send_codec_.reset(new webrtc::CodecInst(send_codec));
diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
index 58893b9..5974a04 100644
--- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc
+++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
@@ -1217,6 +1217,17 @@
EXPECT_TRUE(channel_->SetSendCodecs(codecs));
EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
}
+
+// Test the with non-Opus, even if useinbandfec=1, FEC is off.
+TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = voe_.GetLastChannel();
+ std::vector<cricket::AudioCodec> codecs;
+ codecs.push_back(kIsacCodec);
+ codecs[0].params["useinbandfec"] = "1";
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+ EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
+}
#endif // USE_WEBRTC_DEV_BRANCH
// Test AudioOptions controls whether opus FEC is supported in codec list.