Disallow simulcast for H.264.

BUG=

Review URL: https://codereview.webrtc.org/1291673006

Cr-Commit-Position: refs/heads/master@{#9795}
This commit is contained in:
noahric
2015-08-27 01:59:29 -07:00
committed by Commit bot
parent d82819892a
commit fdac516510
2 changed files with 40 additions and 3 deletions

View File

@ -303,6 +303,12 @@ static void MergeFecConfig(const webrtc::FecConfig& other,
output->red_rtx_payload_type = other.red_rtx_payload_type;
}
}
// Returns true if the given codec is disallowed from doing simulcast.
bool IsCodecBlacklistedForSimulcast(const std::string& codec_name) {
return CodecNamesEq(codec_name, kH264CodecName);
}
} // namespace
// Constants defined in talk/media/webrtc/constants.h
@ -2095,9 +2101,17 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
clamped_codec.width = width;
clamped_codec.height = height;
encoder_config.streams = CreateVideoStreams(
clamped_codec, parameters_.options, parameters_.max_bitrate_bps,
dimensions.is_screencast ? 1 : parameters_.config.rtp.ssrcs.size());
// By default, the stream count for the codec configuration should match the
// number of negotiated ssrcs. But if the codec is blacklisted for simulcast
// or a screencast, only configure a single stream.
size_t stream_count = parameters_.config.rtp.ssrcs.size();
if (IsCodecBlacklistedForSimulcast(codec.name) || dimensions.is_screencast) {
stream_count = 1;
}
encoder_config.streams =
CreateVideoStreams(clamped_codec, parameters_.options,
parameters_.max_bitrate_bps, stream_count);
// Conference mode screencast uses 2 temporal layers split at 100kbit.
if (parameters_.options.conference_mode.GetWithDefaultIfUnset(false) &&

View File

@ -644,6 +644,29 @@ TEST_F(WebRtcVideoEngine2Test,
ASSERT_EQ(0u, encoder_factory.encoders().size());
}
TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) {
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
std::vector<cricket::VideoCodec> codecs;
codecs.push_back(kH264Codec);
rtc::scoped_ptr<VideoMediaChannel> channel(
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
EXPECT_TRUE(
channel->AddSendStream(cricket::CreateSimStreamParams("cname", ssrcs)));
// Set the stream to 720p. This should trigger a "real" encoder
// initialization.
cricket::VideoFormat format(
1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420);
EXPECT_TRUE(channel->SetSendStreamFormat(ssrcs[0], format));
ASSERT_EQ(1u, encoder_factory.encoders().size());
FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0];
EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType);
EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams);
}
// Test external codec with be added to the end of the supported codec list.
TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;