diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index b8022e7294..3a37bcb553 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn @@ -745,6 +745,7 @@ if (rtc_include_tests) { "codecs/vp8/default_temporal_layers_unittest.cc", "codecs/vp8/screenshare_layers_unittest.cc", "codecs/vp8/simulcast_unittest.cc", + "codecs/vp9/svc_config_unittest.cc", "codecs/vp9/svc_rate_allocator_unittest.cc", "decoding_state_unittest.cc", "fec_controller_unittest.cc", diff --git a/modules/video_coding/codecs/vp9/svc_config.cc b/modules/video_coding/codecs/vp9/svc_config.cc index 137b167e78..2935dd1571 100644 --- a/modules/video_coding/codecs/vp9/svc_config.cc +++ b/modules/video_coding/codecs/vp9/svc_config.cc @@ -56,7 +56,7 @@ std::vector GetSvcConfig(size_t input_width, spatial_layer.maxBitrate = static_cast((1.5 * num_pixels + 75 * 1000) / 1000); spatial_layer.targetBitrate = - (spatial_layer.maxBitrate - spatial_layer.minBitrate) / 2; + (spatial_layer.maxBitrate + spatial_layer.minBitrate) / 2; spatial_layers.push_back(spatial_layer); } diff --git a/modules/video_coding/codecs/vp9/svc_config_unittest.cc b/modules/video_coding/codecs/vp9/svc_config_unittest.cc new file mode 100644 index 0000000000..ab47a6fdee --- /dev/null +++ b/modules/video_coding/codecs/vp9/svc_config_unittest.cc @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include +#include +#include + +#include "modules/video_coding/codecs/vp9/include/vp9_globals.h" +#include "modules/video_coding/codecs/vp9/svc_config.h" +#include "test/gtest.h" + +namespace webrtc { +TEST(SvcConfig, NumSpatialLayers) { + const size_t max_num_spatial_layers = 6; + const size_t num_spatial_layers = 2; + + std::vector spatial_layers = + GetSvcConfig(kMinVp9SpatialLayerWidth << (num_spatial_layers - 1), + kMinVp9SpatialLayerHeight << (num_spatial_layers - 1), + max_num_spatial_layers, 1); + + EXPECT_EQ(spatial_layers.size(), num_spatial_layers); +} + +TEST(SvcConfig, BitrateThresholds) { + const size_t num_spatial_layers = 3; + std::vector spatial_layers = + GetSvcConfig(kMinVp9SpatialLayerWidth << (num_spatial_layers - 1), + kMinVp9SpatialLayerHeight << (num_spatial_layers - 1), + num_spatial_layers, 1); + + EXPECT_EQ(spatial_layers.size(), num_spatial_layers); + + for (const SpatialLayer& layer : spatial_layers) { + EXPECT_LE(layer.minBitrate, layer.maxBitrate); + EXPECT_LE(layer.minBitrate, layer.targetBitrate); + EXPECT_LE(layer.targetBitrate, layer.maxBitrate); + } +} +} // namespace webrtc