Adds support for VP9 scalability layers to scenario tests.

Bug: webrtc:9510
Change-Id: I8d2823114bc921ed3412e3abda5501ce73f5a6fb
Reviewed-on: https://webrtc-review.googlesource.com/c/123042
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26743}
This commit is contained in:
Sebastian Jansson 2019-02-18 16:55:15 +01:00 committed by Commit Bot
parent 9c31ac2323
commit 06c51455fc
2 changed files with 49 additions and 13 deletions

View File

@ -150,6 +150,16 @@ struct VideoStreamConfig {
bool denoising = true;
bool automatic_scaling = true;
} single;
struct Layers {
int temporal = 1;
int spatial = 1;
enum class Prediction {
kTemporalOnly,
kSpatialOnKey,
kFull,
} prediction = Prediction::kFull;
} layers;
using DegradationPreference = DegradationPreference;
DegradationPreference degradation_preference =
DegradationPreference::MAINTAIN_FRAMERATE;

View File

@ -74,6 +74,18 @@ VideoEncoderConfig::ContentType ConvertContentType(
return VideoEncoderConfig::ContentType::kScreen;
}
}
InterLayerPredMode ToInterLayerPredMode(
VideoStreamConfig::Encoder::Layers::Prediction value) {
using Pred = VideoStreamConfig::Encoder::Layers::Prediction;
switch (value) {
case Pred::kTemporalOnly:
return InterLayerPredMode::kOff;
case Pred::kSpatialOnKey:
return InterLayerPredMode::kOnKeyPic;
case Pred::kFull:
return InterLayerPredMode::kOn;
}
}
std::vector<RtpExtension> GetVideoRtpExtensions(
const VideoStreamConfig config) {
return {RtpExtension(RtpExtension::kTransportSequenceNumberUri,
@ -120,26 +132,37 @@ VideoSendStream::Config CreateVideoSendStreamConfig(VideoStreamConfig config,
return send_config;
}
rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
CreateVp9SpecificSettings(VideoStreamConfig config) {
VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
vp9_settings.frameDroppingOn = config.encoder.frame_dropping;
vp9_settings.keyFrameInterval = config.encoder.key_frame_interval.value_or(0);
vp9_settings.automaticResizeOn = config.encoder.single.automatic_scaling;
vp9_settings.denoisingOn = config.encoder.single.denoising;
CreateVp9SpecificSettings(VideoStreamConfig video_config) {
constexpr auto kScreen = VideoStreamConfig::Encoder::ContentType::kScreen;
VideoStreamConfig::Encoder conf = video_config.encoder;
VideoCodecVP9 vp9 = VideoEncoder::GetDefaultVp9Settings();
vp9.frameDroppingOn = conf.frame_dropping;
vp9.keyFrameInterval = conf.key_frame_interval.value_or(0);
vp9.numberOfTemporalLayers = static_cast<uint8_t>(conf.layers.temporal);
vp9.numberOfSpatialLayers = static_cast<uint8_t>(conf.layers.spatial);
vp9.interLayerPred = ToInterLayerPredMode(conf.layers.prediction);
if (config.encoder.content_type ==
VideoStreamConfig::Encoder::ContentType::kScreen) {
vp9_settings.automaticResizeOn = false;
// High FPS vp9 screenshare requires flexible mode.
if (config.source.framerate > 5)
vp9_settings.flexibleMode = true;
if (conf.content_type == kScreen &&
(video_config.source.framerate > 5 || conf.layers.spatial >= 3)) {
vp9.flexibleMode = true;
}
if (conf.content_type == kScreen ||
conf.layers.temporal * conf.layers.spatial) {
vp9.automaticResizeOn = false;
vp9.denoisingOn = false;
} else {
vp9.automaticResizeOn = conf.single.automatic_scaling;
vp9.denoisingOn = conf.single.denoising;
}
return new rtc::RefCountedObject<
VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9);
}
rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
CreateVp8SpecificSettings(VideoStreamConfig config) {
RTC_DCHECK_EQ(config.encoder.layers.temporal, 1);
RTC_DCHECK_EQ(config.encoder.layers.spatial, 1);
VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
vp8_settings.frameDroppingOn = config.encoder.frame_dropping;
vp8_settings.keyFrameInterval = config.encoder.key_frame_interval.value_or(0);
@ -151,6 +174,9 @@ CreateVp8SpecificSettings(VideoStreamConfig config) {
rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
CreateH264SpecificSettings(VideoStreamConfig config) {
RTC_DCHECK_EQ(config.encoder.layers.temporal, 1);
RTC_DCHECK_EQ(config.encoder.layers.spatial, 1);
VideoCodecH264 h264_settings = VideoEncoder::GetDefaultH264Settings();
h264_settings.frameDroppingOn = config.encoder.frame_dropping;
h264_settings.keyFrameInterval =