Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(498)

Unified Diff: webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h

Issue 2956243002: Add SetCodecSettings method for configuring VideoCodec settings. (Closed)
Patch Set: address comment Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
diff --git a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
index 5c275aa949015bd3ef63aa340d2283f2258b4488..8c19ae5c30a783853eef97966b01c119bc68ba6e 100644
--- a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
+++ b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
@@ -61,30 +61,27 @@ const int kMaxNumTemporalLayers = 3;
const int kPercTargetvsActualMismatch = 20;
const int kBaseKeyFrameInterval = 3000;
-// Default sequence is foreman (CIF): may be better to use VGA for resize test.
-const int kCifWidth = 352;
-const int kCifHeight = 288;
-const char kFilenameForemanCif[] = "foreman_cif";
-
-// Codec and network settings.
-struct CodecParams {
- VideoCodecType codec_type;
+// Process and network settings.
+struct ProcessParams {
+ ProcessParams(bool hw_codec,
+ bool use_single_core,
+ float packet_loss_probability,
+ int key_frame_interval,
+ std::string filename,
+ bool verbose_logging,
+ bool batch_mode)
+ : hw_codec(hw_codec),
+ use_single_core(use_single_core),
+ key_frame_interval(key_frame_interval),
+ packet_loss_probability(packet_loss_probability),
+ filename(filename),
+ verbose_logging(verbose_logging),
+ batch_mode(batch_mode) {}
+
bool hw_codec;
bool use_single_core;
-
- int width;
- int height;
-
- int num_temporal_layers;
int key_frame_interval;
- bool error_concealment_on;
- bool denoising_on;
- bool frame_dropper_on;
- bool spatial_resize_on;
- bool resilience_on;
-
float packet_loss_probability; // [0.0, 1.0].
-
std::string filename;
bool verbose_logging;
@@ -169,7 +166,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
}
virtual ~VideoProcessorIntegrationTest() = default;
- void CreateEncoderAndDecoder(bool hw_codec, VideoCodecType codec_type) {
+ void CreateEncoderAndDecoder(bool hw_codec) {
if (hw_codec) {
#if defined(WEBRTC_VIDEOPROCESSOR_INTEGRATIONTEST_HW_CODECS_ENABLED)
#if defined(WEBRTC_ANDROID)
@@ -177,7 +174,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
// allocated them. For the particular case of the Android
// MediaCodecVideo{En,De}coderFactory's, however, it turns out that it is
// fine for the std::unique_ptr to destroy the owned codec directly.
- switch (codec_type) {
+ switch (config_.codec_settings->codecType) {
case kVideoCodecH264:
encoder_.reset(external_encoder_factory_->CreateVideoEncoder(
cricket::VideoCodec(cricket::kH264CodecName)));
@@ -201,7 +198,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
break;
}
#elif defined(WEBRTC_IOS)
- ASSERT_EQ(kVideoCodecH264, codec_type)
+ ASSERT_EQ(kVideoCodecH264, config_.codec_settings->codecType)
<< "iOS HW codecs only support H264.";
encoder_.reset(new H264VideoToolboxEncoder(
cricket::VideoCodec(cricket::kH264CodecName)));
@@ -216,7 +213,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
}
// SW codecs.
- switch (codec_type) {
+ switch (config_.codec_settings->codecType) {
case kVideoCodecH264:
encoder_.reset(
H264Encoder::Create(cricket::VideoCodec(cricket::kH264CodecName)));
@@ -236,9 +233,9 @@ class VideoProcessorIntegrationTest : public testing::Test {
}
}
- void SetUpCodecConfig(const CodecParams& process,
+ void SetUpCodecConfig(const ProcessParams& process,
const VisualizationParams* visualization_params) {
- CreateEncoderAndDecoder(process.hw_codec, process.codec_type);
+ CreateEncoderAndDecoder(process.hw_codec);
// Configure input filename.
config_.input_filename = test::ResourcePath(process.filename, "yuv");
@@ -249,58 +246,15 @@ class VideoProcessorIntegrationTest : public testing::Test {
test::OutputPath(), "videoprocessor_integrationtest");
config_.frame_length_in_bytes =
- CalcBufferSize(VideoType::kI420, process.width, process.height);
+ CalcBufferSize(VideoType::kI420, config_.codec_settings->width,
+ config_.codec_settings->height);
config_.verbose = process.verbose_logging;
config_.use_single_core = process.use_single_core;
+
// Key frame interval and packet loss are set for each test.
config_.keyframe_interval = process.key_frame_interval;
config_.networking_config.packet_loss_probability =
- packet_loss_probability_;
-
- // Configure codec settings.
- VideoCodingModule::Codec(process.codec_type, &codec_settings_);
- config_.codec_settings = &codec_settings_;
- config_.codec_settings->startBitrate = start_bitrate_;
- config_.codec_settings->width = process.width;
- config_.codec_settings->height = process.height;
-
- // These features may be set depending on the test.
- switch (config_.codec_settings->codecType) {
- case kVideoCodecH264:
- config_.codec_settings->H264()->frameDroppingOn =
- process.frame_dropper_on;
- config_.codec_settings->H264()->keyFrameInterval =
- kBaseKeyFrameInterval;
- break;
- case kVideoCodecVP8:
- config_.codec_settings->VP8()->errorConcealmentOn =
- process.error_concealment_on;
- config_.codec_settings->VP8()->denoisingOn = process.denoising_on;
- config_.codec_settings->VP8()->numberOfTemporalLayers =
- num_temporal_layers_;
- config_.codec_settings->VP8()->frameDroppingOn =
- process.frame_dropper_on;
- config_.codec_settings->VP8()->automaticResizeOn =
- process.spatial_resize_on;
- config_.codec_settings->VP8()->keyFrameInterval = kBaseKeyFrameInterval;
- config_.codec_settings->VP8()->resilience =
- process.resilience_on ? kResilientStream : kResilienceOff;
- break;
- case kVideoCodecVP9:
- config_.codec_settings->VP9()->denoisingOn = process.denoising_on;
- config_.codec_settings->VP9()->numberOfTemporalLayers =
- num_temporal_layers_;
- config_.codec_settings->VP9()->frameDroppingOn =
- process.frame_dropper_on;
- config_.codec_settings->VP9()->automaticResizeOn =
- process.spatial_resize_on;
- config_.codec_settings->VP9()->keyFrameInterval = kBaseKeyFrameInterval;
- config_.codec_settings->VP9()->resilienceOn = process.resilience_on;
- break;
- default:
- RTC_NOTREACHED();
- break;
- }
+ process.packet_loss_probability;
// Create file objects for quality analysis.
analysis_frame_reader_.reset(new test::YuvFrameReaderImpl(
@@ -316,10 +270,12 @@ class VideoProcessorIntegrationTest : public testing::Test {
// clang-format off
const std::string output_filename_base =
test::OutputPath() + process.filename +
- "_cd-" + CodecTypeToPayloadName(process.codec_type).value_or("") +
+ "_cd-" + CodecTypeToPayloadName(
+ config_.codec_settings->codecType).value_or("") +
"_hw-" + std::to_string(process.hw_codec) +
"_fr-" + std::to_string(start_frame_rate_) +
- "_br-" + std::to_string(static_cast<int>(start_bitrate_));
+ "_br-" + std::to_string(
+ static_cast<int>(config_.codec_settings->startBitrate));
// clang-format on
if (visualization_params->save_source_y4m) {
source_frame_writer_.reset(new test::Y4mFrameWriterImpl(
@@ -498,14 +454,25 @@ class VideoProcessorIntegrationTest : public testing::Test {
EXPECT_GT(ssim_result.min, quality_thresholds.min_min_ssim);
}
- void VerifyQpParser(const CodecParams& process, int frame_number) {
- if (!process.hw_codec && (process.codec_type == kVideoCodecVP8 ||
- process.codec_type == kVideoCodecVP9)) {
+ void VerifyQpParser(const ProcessParams& process, int frame_number) {
+ if (!process.hw_codec &&
+ (config_.codec_settings->codecType == kVideoCodecVP8 ||
+ config_.codec_settings->codecType == kVideoCodecVP9)) {
EXPECT_EQ(processor_->GetQpFromEncoder(frame_number),
processor_->GetQpFromBitstream(frame_number));
}
}
+ int NumberOfTemporalLayers(const VideoCodec* codec_settings) {
+ if (codec_settings->codecType == kVideoCodecVP8) {
+ return codec_settings->VP8().numberOfTemporalLayers;
+ } else if (codec_settings->codecType == kVideoCodecVP9) {
+ return codec_settings->VP9().numberOfTemporalLayers;
+ } else {
+ return 1;
+ }
+ }
+
// Temporal layer index corresponding to frame number, for up to 3 layers.
int TemporalLayerIndexForFrame(int frame_number) {
int tl_idx = -1;
@@ -566,14 +533,14 @@ class VideoProcessorIntegrationTest : public testing::Test {
// e.g., when we are operating in batch mode.
void ProcessFramesAndVerify(QualityThresholds quality_thresholds,
RateProfile rate_profile,
- CodecParams process,
+ ProcessParams process,
RateControlThresholds* rc_thresholds,
const VisualizationParams* visualization_params) {
// Codec/config settings.
- start_bitrate_ = rate_profile.target_bit_rate[0];
+ RTC_CHECK(config_.codec_settings);
+ num_temporal_layers_ = NumberOfTemporalLayers(config_.codec_settings);
+ config_.codec_settings->startBitrate = rate_profile.target_bit_rate[0];
start_frame_rate_ = rate_profile.input_frame_rate[0];
- packet_loss_probability_ = process.packet_loss_probability;
- num_temporal_layers_ = process.num_temporal_layers;
SetUpCodecConfig(process, visualization_params);
// Update the temporal layers and the codec with the initial rates.
bit_rate_ = rate_profile.target_bit_rate[0];
@@ -689,59 +656,52 @@ class VideoProcessorIntegrationTest : public testing::Test {
}
}
- static void SetCodecParams(CodecParams* process_settings,
- VideoCodecType codec_type,
- bool hw_codec,
- bool use_single_core,
- float packet_loss_probability,
- int key_frame_interval,
- int num_temporal_layers,
- bool error_concealment_on,
- bool denoising_on,
- bool frame_dropper_on,
- bool spatial_resize_on,
- bool resilience_on,
- int width,
- int height,
- const std::string& filename,
- bool verbose_logging,
- bool batch_mode) {
- process_settings->codec_type = codec_type;
- process_settings->hw_codec = hw_codec;
- process_settings->use_single_core = use_single_core;
- process_settings->packet_loss_probability = packet_loss_probability;
- process_settings->key_frame_interval = key_frame_interval;
- process_settings->num_temporal_layers = num_temporal_layers,
- process_settings->error_concealment_on = error_concealment_on;
- process_settings->denoising_on = denoising_on;
- process_settings->frame_dropper_on = frame_dropper_on;
- process_settings->spatial_resize_on = spatial_resize_on;
- process_settings->resilience_on = resilience_on;
- process_settings->width = width;
- process_settings->height = height;
- process_settings->filename = filename;
- process_settings->verbose_logging = verbose_logging;
- process_settings->batch_mode = batch_mode;
- }
-
- static void SetCodecParams(CodecParams* process_settings,
- VideoCodecType codec_type,
- bool hw_codec,
- bool use_single_core,
- float packet_loss_probability,
- int key_frame_interval,
- int num_temporal_layers,
- bool error_concealment_on,
- bool denoising_on,
- bool frame_dropper_on,
- bool spatial_resize_on,
- bool resilience_on) {
- SetCodecParams(process_settings, codec_type, hw_codec, use_single_core,
- packet_loss_probability, key_frame_interval,
- num_temporal_layers, error_concealment_on, denoising_on,
- frame_dropper_on, spatial_resize_on, resilience_on,
- kCifWidth, kCifHeight, kFilenameForemanCif,
- false /* verbose_logging */, false /* batch_mode */);
+ static void SetCodecSettings(test::TestConfig* config,
+ VideoCodec* codec_settings,
+ VideoCodecType codec_type,
+ int num_temporal_layers,
+ bool error_concealment_on,
+ bool denoising_on,
+ bool frame_dropper_on,
+ bool spatial_resize_on,
+ bool resilience_on,
+ int width,
+ int height) {
+ VideoCodingModule::Codec(codec_type, codec_settings);
+ config->codec_settings = codec_settings;
+ config->codec_settings->width = width;
+ config->codec_settings->height = height;
+ switch (config->codec_settings->codecType) {
+ case kVideoCodecH264:
+ config->codec_settings->H264()->frameDroppingOn = frame_dropper_on;
+ config->codec_settings->H264()->keyFrameInterval =
+ kBaseKeyFrameInterval;
+ break;
+ case kVideoCodecVP8:
+ config->codec_settings->VP8()->errorConcealmentOn =
+ error_concealment_on;
+ config->codec_settings->VP8()->denoisingOn = denoising_on;
+ config->codec_settings->VP8()->numberOfTemporalLayers =
+ num_temporal_layers;
+ config->codec_settings->VP8()->frameDroppingOn = frame_dropper_on;
+ config->codec_settings->VP8()->automaticResizeOn = spatial_resize_on;
+ config->codec_settings->VP8()->keyFrameInterval = kBaseKeyFrameInterval;
+ config->codec_settings->VP8()->resilience =
+ resilience_on ? kResilientStream : kResilienceOff;
+ break;
+ case kVideoCodecVP9:
+ config->codec_settings->VP9()->denoisingOn = denoising_on;
+ config->codec_settings->VP9()->numberOfTemporalLayers =
+ num_temporal_layers;
+ config->codec_settings->VP9()->frameDroppingOn = frame_dropper_on;
+ config->codec_settings->VP9()->automaticResizeOn = spatial_resize_on;
+ config->codec_settings->VP9()->keyFrameInterval = kBaseKeyFrameInterval;
+ config->codec_settings->VP9()->resilienceOn = resilience_on;
+ break;
+ default:
+ RTC_NOTREACHED();
+ break;
+ }
}
static void SetQualityThresholds(QualityThresholds* quality_thresholds,
@@ -829,11 +789,9 @@ class VideoProcessorIntegrationTest : public testing::Test {
float target_size_key_frame_;
float sum_key_frame_size_mismatch_;
int num_key_frames_;
- float start_bitrate_;
int start_frame_rate_;
// Codec and network settings.
- float packet_loss_probability_;
int num_temporal_layers_;
};

Powered by Google App Engine
This is Rietveld 408576698