red: only enable RED if its preferred as send codec
only enables RFC 2198 redundancy if it has a higher preference than Opus. This means it not used by default but can be chosen with setCodecPreferences. BUG=webrtc:11640 Change-Id: I84ff2ca518da70440297a667dedba5cf4484eed7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/178742 Commit-Queue: Niels Moller <nisse@webrtc.org> Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31830}
This commit is contained in:

committed by
Commit Bot

parent
834dc9cfa1
commit
e48851d910
@ -1719,6 +1719,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
||||
send_codec_spec;
|
||||
webrtc::BitrateConstraints bitrate_config;
|
||||
absl::optional<webrtc::AudioCodecInfo> voice_codec_info;
|
||||
size_t send_codec_position = 0;
|
||||
for (const AudioCodec& voice_codec : codecs) {
|
||||
if (!(IsCodec(voice_codec, kCnCodecName) ||
|
||||
IsCodec(voice_codec, kDtmfCodecName) ||
|
||||
@ -1742,6 +1743,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
||||
bitrate_config = GetBitrateConfigForCodec(voice_codec);
|
||||
break;
|
||||
}
|
||||
send_codec_position++;
|
||||
}
|
||||
|
||||
if (!send_codec_spec) {
|
||||
@ -1783,13 +1785,16 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
||||
if (IsAudioRedForOpusFieldTrialEnabled()) {
|
||||
// Loop through the codecs to find the RED codec that matches opus
|
||||
// with respect to clockrate and number of channels.
|
||||
size_t red_codec_position = 0;
|
||||
for (const AudioCodec& red_codec : codecs) {
|
||||
if (IsCodec(red_codec, kRedCodecName) &&
|
||||
if (red_codec_position < send_codec_position &&
|
||||
IsCodec(red_codec, kRedCodecName) &&
|
||||
red_codec.clockrate == send_codec_spec->format.clockrate_hz &&
|
||||
red_codec.channels == send_codec_spec->format.num_channels) {
|
||||
send_codec_spec->red_payload_type = red_codec.id;
|
||||
break;
|
||||
}
|
||||
red_codec_position++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1507,33 +1507,35 @@ TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecs) {
|
||||
EXPECT_FALSE(channel_->CanInsertDtmf());
|
||||
}
|
||||
|
||||
// Test that we set Opus/Red under the field trial.
|
||||
// Test that we use Opus/Red under the field trial when it is
|
||||
// listed as the first codec.
|
||||
TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRed) {
|
||||
webrtc::test::ScopedFieldTrials override_field_trials(
|
||||
"WebRTC-Audio-Red-For-Opus/Enabled/");
|
||||
|
||||
EXPECT_TRUE(SetupSendStream());
|
||||
cricket::AudioSendParameters parameters;
|
||||
parameters.codecs.push_back(kRed48000Codec);
|
||||
parameters.codecs.push_back(kOpusCodec);
|
||||
SetSendParameters(parameters);
|
||||
const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
|
||||
EXPECT_EQ(111, send_codec_spec.payload_type);
|
||||
EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
|
||||
EXPECT_EQ(112, send_codec_spec.red_payload_type);
|
||||
}
|
||||
|
||||
// Test that we do not use Opus/Red under the field trial by default.
|
||||
TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedDefault) {
|
||||
webrtc::test::ScopedFieldTrials override_field_trials(
|
||||
"WebRTC-Audio-Red-For-Opus/Enabled/");
|
||||
|
||||
EXPECT_TRUE(SetupSendStream());
|
||||
cricket::AudioSendParameters parameters;
|
||||
parameters.codecs.push_back(kOpusCodec);
|
||||
parameters.codecs.push_back(kRed48000Codec);
|
||||
parameters.codecs[0].id = 96;
|
||||
SetSendParameters(parameters);
|
||||
const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
|
||||
EXPECT_EQ(96, send_codec_spec.payload_type);
|
||||
EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
|
||||
EXPECT_EQ(112, send_codec_spec.red_payload_type);
|
||||
}
|
||||
|
||||
// Test that we set do not interpret Opus/Red by default.
|
||||
TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedDefault) {
|
||||
EXPECT_TRUE(SetupSendStream());
|
||||
cricket::AudioSendParameters parameters;
|
||||
parameters.codecs.push_back(kOpusCodec);
|
||||
parameters.codecs.push_back(kRed48000Codec);
|
||||
parameters.codecs[0].id = 96;
|
||||
SetSendParameters(parameters);
|
||||
const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
|
||||
EXPECT_EQ(96, send_codec_spec.payload_type);
|
||||
EXPECT_EQ(111, send_codec_spec.payload_type);
|
||||
EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
|
||||
EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
|
||||
}
|
||||
|
Reference in New Issue
Block a user