LibvpxVp9Encoder: add option to configure resolution_bitrate_limits.
Bug: none Change-Id: Icdd7333296d652b1e0c159226df702084303475c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/204701 Reviewed-by: Sergey Silkin <ssilkin@webrtc.org> Commit-Queue: Åsa Persson <asapersson@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33121}
This commit is contained in:
@ -5356,6 +5356,123 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenSVCLayersChange) {
|
||||
video_stream_encoder_->Stop();
|
||||
}
|
||||
|
||||
TEST_F(VideoStreamEncoderTest,
|
||||
EncoderMaxAndMinBitratesUsedIfMiddleStreamActive) {
|
||||
const VideoEncoder::ResolutionBitrateLimits kEncoderLimits270p(
|
||||
480 * 270, 34 * 1000, 12 * 1000, 1234 * 1000);
|
||||
const VideoEncoder::ResolutionBitrateLimits kEncoderLimits360p(
|
||||
640 * 360, 43 * 1000, 21 * 1000, 2345 * 1000);
|
||||
const VideoEncoder::ResolutionBitrateLimits kEncoderLimits720p(
|
||||
1280 * 720, 54 * 1000, 31 * 1000, 2500 * 1000);
|
||||
fake_encoder_.SetResolutionBitrateLimits(
|
||||
{kEncoderLimits270p, kEncoderLimits360p, kEncoderLimits720p});
|
||||
|
||||
VideoEncoderConfig video_encoder_config;
|
||||
test::FillEncoderConfiguration(PayloadStringToCodecType("VP9"), 1,
|
||||
&video_encoder_config);
|
||||
VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
|
||||
vp9_settings.numberOfSpatialLayers = 3;
|
||||
// Since only one layer is active - automatic resize should be enabled.
|
||||
vp9_settings.automaticResizeOn = true;
|
||||
video_encoder_config.encoder_specific_settings =
|
||||
new rtc::RefCountedObject<VideoEncoderConfig::Vp9EncoderSpecificSettings>(
|
||||
vp9_settings);
|
||||
video_encoder_config.max_bitrate_bps = kSimulcastTargetBitrateBps;
|
||||
video_encoder_config.content_type =
|
||||
VideoEncoderConfig::ContentType::kRealtimeVideo;
|
||||
// Simulcast layers are used to indicate which spatial layers are active.
|
||||
video_encoder_config.simulcast_layers.resize(3);
|
||||
video_encoder_config.simulcast_layers[0].active = false;
|
||||
video_encoder_config.simulcast_layers[1].active = true;
|
||||
video_encoder_config.simulcast_layers[2].active = false;
|
||||
|
||||
video_stream_encoder_->ConfigureEncoder(video_encoder_config.Copy(),
|
||||
kMaxPayloadLength);
|
||||
video_stream_encoder_->WaitUntilTaskQueueIsIdle();
|
||||
|
||||
// The encoder bitrate limits for 360p should be used.
|
||||
video_source_.IncomingCapturedFrame(CreateFrame(1, 1280, 720));
|
||||
EXPECT_FALSE(WaitForFrame(1000));
|
||||
EXPECT_EQ(fake_encoder_.video_codec().numberOfSimulcastStreams, 1);
|
||||
EXPECT_EQ(fake_encoder_.video_codec().codecType,
|
||||
VideoCodecType::kVideoCodecVP9);
|
||||
EXPECT_EQ(fake_encoder_.video_codec().VP9()->numberOfSpatialLayers, 2);
|
||||
EXPECT_TRUE(fake_encoder_.video_codec().spatialLayers[0].active);
|
||||
EXPECT_EQ(640, fake_encoder_.video_codec().spatialLayers[0].width);
|
||||
EXPECT_EQ(360, fake_encoder_.video_codec().spatialLayers[0].height);
|
||||
EXPECT_EQ(static_cast<uint32_t>(kEncoderLimits360p.min_bitrate_bps),
|
||||
fake_encoder_.video_codec().spatialLayers[0].minBitrate * 1000);
|
||||
EXPECT_EQ(static_cast<uint32_t>(kEncoderLimits360p.max_bitrate_bps),
|
||||
fake_encoder_.video_codec().spatialLayers[0].maxBitrate * 1000);
|
||||
|
||||
// The encoder bitrate limits for 270p should be used.
|
||||
video_source_.IncomingCapturedFrame(CreateFrame(2, 960, 540));
|
||||
EXPECT_FALSE(WaitForFrame(1000));
|
||||
EXPECT_EQ(fake_encoder_.video_codec().numberOfSimulcastStreams, 1);
|
||||
EXPECT_EQ(fake_encoder_.video_codec().codecType,
|
||||
VideoCodecType::kVideoCodecVP9);
|
||||
EXPECT_EQ(fake_encoder_.video_codec().VP9()->numberOfSpatialLayers, 2);
|
||||
EXPECT_TRUE(fake_encoder_.video_codec().spatialLayers[0].active);
|
||||
EXPECT_EQ(480, fake_encoder_.video_codec().spatialLayers[0].width);
|
||||
EXPECT_EQ(270, fake_encoder_.video_codec().spatialLayers[0].height);
|
||||
EXPECT_EQ(static_cast<uint32_t>(kEncoderLimits270p.min_bitrate_bps),
|
||||
fake_encoder_.video_codec().spatialLayers[0].minBitrate * 1000);
|
||||
EXPECT_EQ(static_cast<uint32_t>(kEncoderLimits270p.max_bitrate_bps),
|
||||
fake_encoder_.video_codec().spatialLayers[0].maxBitrate * 1000);
|
||||
|
||||
video_stream_encoder_->Stop();
|
||||
}
|
||||
|
||||
TEST_F(VideoStreamEncoderTest,
|
||||
EncoderMaxAndMinBitratesNotUsedIfLowestStreamActive) {
|
||||
const VideoEncoder::ResolutionBitrateLimits kEncoderLimits180p(
|
||||
320 * 180, 34 * 1000, 12 * 1000, 1234 * 1000);
|
||||
const VideoEncoder::ResolutionBitrateLimits kEncoderLimits720p(
|
||||
1280 * 720, 54 * 1000, 31 * 1000, 2500 * 1000);
|
||||
fake_encoder_.SetResolutionBitrateLimits(
|
||||
{kEncoderLimits180p, kEncoderLimits720p});
|
||||
|
||||
VideoEncoderConfig video_encoder_config;
|
||||
test::FillEncoderConfiguration(PayloadStringToCodecType("VP9"), 1,
|
||||
&video_encoder_config);
|
||||
VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
|
||||
vp9_settings.numberOfSpatialLayers = 3;
|
||||
// Since only one layer is active - automatic resize should be enabled.
|
||||
vp9_settings.automaticResizeOn = true;
|
||||
video_encoder_config.encoder_specific_settings =
|
||||
new rtc::RefCountedObject<VideoEncoderConfig::Vp9EncoderSpecificSettings>(
|
||||
vp9_settings);
|
||||
video_encoder_config.max_bitrate_bps = kSimulcastTargetBitrateBps;
|
||||
video_encoder_config.content_type =
|
||||
VideoEncoderConfig::ContentType::kRealtimeVideo;
|
||||
// Simulcast layers are used to indicate which spatial layers are active.
|
||||
video_encoder_config.simulcast_layers.resize(3);
|
||||
video_encoder_config.simulcast_layers[0].active = true;
|
||||
video_encoder_config.simulcast_layers[1].active = false;
|
||||
video_encoder_config.simulcast_layers[2].active = false;
|
||||
|
||||
video_stream_encoder_->ConfigureEncoder(video_encoder_config.Copy(),
|
||||
kMaxPayloadLength);
|
||||
video_stream_encoder_->WaitUntilTaskQueueIsIdle();
|
||||
|
||||
// Limits not applied on lowest stream, limits for 180p should not be used.
|
||||
video_source_.IncomingCapturedFrame(CreateFrame(1, 1280, 720));
|
||||
EXPECT_FALSE(WaitForFrame(1000));
|
||||
EXPECT_EQ(fake_encoder_.video_codec().numberOfSimulcastStreams, 1);
|
||||
EXPECT_EQ(fake_encoder_.video_codec().codecType,
|
||||
VideoCodecType::kVideoCodecVP9);
|
||||
EXPECT_EQ(fake_encoder_.video_codec().VP9()->numberOfSpatialLayers, 3);
|
||||
EXPECT_TRUE(fake_encoder_.video_codec().spatialLayers[0].active);
|
||||
EXPECT_EQ(320, fake_encoder_.video_codec().spatialLayers[0].width);
|
||||
EXPECT_EQ(180, fake_encoder_.video_codec().spatialLayers[0].height);
|
||||
EXPECT_NE(static_cast<uint32_t>(kEncoderLimits180p.min_bitrate_bps),
|
||||
fake_encoder_.video_codec().spatialLayers[0].minBitrate * 1000);
|
||||
EXPECT_NE(static_cast<uint32_t>(kEncoderLimits180p.max_bitrate_bps),
|
||||
fake_encoder_.video_codec().spatialLayers[0].maxBitrate * 1000);
|
||||
|
||||
video_stream_encoder_->Stop();
|
||||
}
|
||||
|
||||
TEST_F(VideoStreamEncoderTest,
|
||||
InitialFrameDropActivatesWhenResolutionIncreases) {
|
||||
const int kWidth = 640;
|
||||
|
||||
Reference in New Issue
Block a user