Added number of simulcast/spatial layers to TestConfig.

These parameters allow to configure number of simulcast/spatial layers
in video codec tests.

Bug: webrtc:8524
Change-Id: Iad1332732758a8297abcf740c24c483e5fccec9a
Reviewed-on: https://webrtc-review.googlesource.com/43020
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21741}
This commit is contained in:
Sergey Silkin
2018-01-23 17:24:02 +01:00
committed by Commit Bot
parent 2880ea300e
commit b7d7301d7e
10 changed files with 84 additions and 63 deletions

View File

@ -12,6 +12,7 @@
#include <sstream>
#include "media/engine/simulcast.h"
#include "modules/video_coding/include/video_codec_interface.h"
#include "rtc_base/checks.h"
#include "system_wrappers/include/cpu_info.h"
@ -22,6 +23,9 @@ namespace test {
namespace {
const int kBaseKeyFrameInterval = 3000;
const int kMaxBitrateBps = 5000 * 1000; // From kSimulcastFormats.
const int kMaxFramerateFps = 30;
const int kMaxQp = 56;
std::string CodecSpecificToString(const webrtc::VideoCodec& codec) {
std::stringstream ss;
@ -67,6 +71,8 @@ std::string CodecSpecificToString(const webrtc::VideoCodec& codec) {
} // namespace
void TestConfig::SetCodecSettings(VideoCodecType codec_type,
size_t num_simulcast_streams,
size_t num_spatial_layers,
size_t num_temporal_layers,
bool error_concealment_on,
bool denoising_on,
@ -82,6 +88,22 @@ void TestConfig::SetCodecSettings(VideoCodecType codec_type,
codec_settings.width = static_cast<uint16_t>(width);
codec_settings.height = static_cast<uint16_t>(height);
RTC_CHECK(num_simulcast_streams >= 1 &&
num_simulcast_streams <= kMaxSimulcastStreams);
RTC_CHECK(num_spatial_layers >= 1 && num_spatial_layers <= kMaxSpatialLayers);
// Simulcast is only available with VP8.
RTC_CHECK(num_simulcast_streams < 2 || codec_type == kVideoCodecVP8);
// Spatial scalability is only available with VP9.
RTC_CHECK(num_spatial_layers < 2 || codec_type == kVideoCodecVP9);
// Some base code requires numberOfSimulcastStreams to be set to zero
// when simulcast is not used.
codec_settings.numberOfSimulcastStreams =
num_simulcast_streams <= 1 ? 0
: static_cast<uint8_t>(num_simulcast_streams);
switch (codec_settings.codecType) {
case kVideoCodecVP8:
codec_settings.VP8()->resilience =
@ -102,6 +124,8 @@ void TestConfig::SetCodecSettings(VideoCodecType codec_type,
codec_settings.VP9()->frameDroppingOn = frame_dropper_on;
codec_settings.VP9()->keyFrameInterval = kBaseKeyFrameInterval;
codec_settings.VP9()->automaticResizeOn = spatial_resize_on;
codec_settings.VP9()->numberOfSpatialLayers =
static_cast<uint8_t>(num_spatial_layers);
break;
case kVideoCodecH264:
codec_settings.H264()->frameDroppingOn = frame_dropper_on;
@ -111,6 +135,29 @@ void TestConfig::SetCodecSettings(VideoCodecType codec_type,
RTC_NOTREACHED();
break;
}
if (codec_settings.numberOfSimulcastStreams > 1) {
ConfigureSimulcast();
}
}
void TestConfig::ConfigureSimulcast() {
std::vector<webrtc::VideoStream> stream = cricket::GetSimulcastConfig(
codec_settings.numberOfSimulcastStreams, codec_settings.width,
codec_settings.height, kMaxBitrateBps, kMaxQp, kMaxFramerateFps, false);
for (size_t i = 0; i < stream.size(); ++i) {
SimulcastStream* ss = &codec_settings.simulcastStream[i];
ss->width = static_cast<uint16_t>(stream[i].width);
ss->height = static_cast<uint16_t>(stream[i].height);
ss->numberOfTemporalLayers = static_cast<unsigned char>(
stream[i].temporal_layer_thresholds_bps.size() + 1);
ss->maxBitrate = stream[i].max_bitrate_bps / 1000;
ss->targetBitrate = stream[i].target_bitrate_bps / 1000;
ss->minBitrate = stream[i].min_bitrate_bps / 1000;
ss->qpMax = stream[i].max_qp;
ss->active = true;
}
}
size_t TestConfig::NumberOfCores() const {
@ -135,6 +182,10 @@ size_t TestConfig::NumberOfSpatialLayers() const {
}
}
size_t TestConfig::NumberOfSimulcastStreams() const {
return codec_settings.numberOfSimulcastStreams;
}
size_t TestConfig::TemporalLayerForFrame(size_t frame_idx) const {
size_t tl = 0;
switch (NumberOfTemporalLayers()) {