| 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 ddd343836b5a23791d75d1b9d7cb76505ac168f4..ceaf7cef94b3288d765d0fb16fe52e777d2ab570 100644
|
| --- a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
|
| +++ b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
|
| @@ -62,32 +62,36 @@ const int kCifHeight = 288;
|
| const char kFilenameForemanCif[] = "foreman_cif";
|
|
|
| // Codec and network settings.
|
| -struct CodecConfigPars {
|
| +struct CodecParams {
|
| VideoCodecType codec_type;
|
| bool hw_codec;
|
| bool use_single_core;
|
| - float packet_loss;
|
| +
|
| + 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;
|
| - int width;
|
| - int height;
|
| +
|
| + float packet_loss_probability; // [0.0, 1.0].
|
| +
|
| std::string filename;
|
| bool verbose_logging;
|
| };
|
|
|
| -// Quality metrics.
|
| -struct QualityMetrics {
|
| - double minimum_avg_psnr;
|
| - double minimum_min_psnr;
|
| - double minimum_avg_ssim;
|
| - double minimum_min_ssim;
|
| +// Thresholds for the quality metrics.
|
| +struct QualityThresholds {
|
| + double min_avg_psnr;
|
| + double min_min_psnr;
|
| + double min_avg_ssim;
|
| + double min_min_ssim;
|
| };
|
|
|
| -// The sequence of bitrate and frame rate changes for the encoder, the frame
|
| +// The sequence of bit rate and frame rate changes for the encoder, the frame
|
| // number where the changes are made, and the total number of frames for the
|
| // test.
|
| struct RateProfile {
|
| @@ -97,12 +101,12 @@ struct RateProfile {
|
| int num_frames;
|
| };
|
|
|
| -// Metrics for the rate control. The rate mismatch metrics are defined as
|
| -// percentages.|max_time_hit_target| is defined as number of frames, after a
|
| -// rate update is made to the encoder, for the encoder to reach within
|
| -// |kPercTargetvsActualMismatch| of new target rate. The metrics are defined for
|
| -// each rate update sequence.
|
| -struct RateControlMetrics {
|
| +// Thresholds for the rate control metrics. The rate mismatch thresholds are
|
| +// defined as percentages. |max_time_hit_target| is defined as number of frames,
|
| +// after a rate update is made to the encoder, for the encoder to reach within
|
| +// |kPercTargetvsActualMismatch| of new target rate. The thresholds are defined
|
| +// for each rate update sequence.
|
| +struct RateControlThresholds {
|
| int max_num_dropped_frames;
|
| int max_key_frame_size_mismatch;
|
| int max_delta_frame_size_mismatch;
|
| @@ -131,12 +135,13 @@ const float kScaleKeyFrameSize = 0.5f;
|
|
|
| // Integration test for video processor. Encodes+decodes a clip and
|
| // writes it to the output directory. After completion, quality metrics
|
| -// (PSNR and SSIM) and rate control metrics are computed to verify that the
|
| -// quality and encoder response is acceptable. The rate control tests allow us
|
| -// to verify the behavior for changing bitrate, changing frame rate, frame
|
| -// dropping/spatial resize, and temporal layers. The limits for the rate
|
| -// control metrics are set to be fairly conservative, so failure should only
|
| -// happen when some significant regression or breakdown occurs.
|
| +// (PSNR and SSIM) and rate control metrics are computed and compared to given
|
| +// thresholds, to verify that the quality and encoder response is acceptable.
|
| +// The rate control tests allow us to verify the behavior for changing bit rate,
|
| +// changing frame rate, frame dropping/spatial resize, and temporal layers.
|
| +// The thresholds for the rate control metrics are set to be fairly
|
| +// conservative, so failure should only happen when some significant regression
|
| +// or breakdown occurs.
|
| class VideoProcessorIntegrationTest : public testing::Test {
|
| protected:
|
| VideoProcessorIntegrationTest() {
|
| @@ -152,7 +157,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| }
|
| virtual ~VideoProcessorIntegrationTest() = default;
|
|
|
| - void SetUpCodecConfig(const CodecConfigPars& process,
|
| + void SetUpCodecConfig(const CodecParams& process,
|
| const VisualizationParams* visualization_params) {
|
| if (process.hw_codec) {
|
| #if defined(WEBRTC_VIDEOPROCESSOR_INTEGRATIONTEST_HW_CODECS_ENABLED)
|
| @@ -233,7 +238,8 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| 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_;
|
| + config_.networking_config.packet_loss_probability =
|
| + packet_loss_probability_;
|
|
|
| // Configure codec settings.
|
| config_.codec_settings = &codec_settings_;
|
| @@ -393,14 +399,14 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| }
|
|
|
| // Verify expected behavior of rate control and print out data.
|
| - void VerifyRateControl(int update_index,
|
| - int max_key_frame_size_mismatch,
|
| - int max_delta_frame_size_mismatch,
|
| - int max_encoding_rate_mismatch,
|
| - int max_time_hit_target,
|
| - int max_num_dropped_frames,
|
| - int num_spatial_resizes,
|
| - int num_key_frames) {
|
| + void VerifyRateControlMetrics(int update_index,
|
| + int max_key_frame_size_mismatch,
|
| + int max_delta_frame_size_mismatch,
|
| + int max_encoding_rate_mismatch,
|
| + int max_time_hit_target,
|
| + int max_num_dropped_frames,
|
| + int num_spatial_resizes,
|
| + int num_key_frames) {
|
| int num_dropped_frames = processor_->NumberDroppedFrames();
|
| int num_resize_actions = processor_->NumberSpatialResizes();
|
| printf(
|
| @@ -454,6 +460,15 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| EXPECT_EQ(num_key_frames_, num_key_frames);
|
| }
|
|
|
| + void VerifyQuality(const test::QualityMetricsResult& psnr_result,
|
| + const test::QualityMetricsResult& ssim_result,
|
| + const QualityThresholds& quality_thresholds) {
|
| + EXPECT_GT(psnr_result.average, quality_thresholds.min_avg_psnr);
|
| + EXPECT_GT(psnr_result.min, quality_thresholds.min_min_psnr);
|
| + EXPECT_GT(ssim_result.average, quality_thresholds.min_avg_ssim);
|
| + EXPECT_GT(ssim_result.min, quality_thresholds.min_min_ssim);
|
| + }
|
| +
|
| // Layer index corresponding to frame number, for up to 3 layers.
|
| void LayerIndexForFrame(int frame_number) {
|
| if (num_temporal_layers_ == 1) {
|
| @@ -505,15 +520,15 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| }
|
|
|
| // Processes all frames in the clip and verifies the result.
|
| - void ProcessFramesAndVerify(QualityMetrics quality_metrics,
|
| + void ProcessFramesAndVerify(QualityThresholds quality_thresholds,
|
| RateProfile rate_profile,
|
| - CodecConfigPars process,
|
| - RateControlMetrics* rc_metrics,
|
| + CodecParams process,
|
| + RateControlThresholds* rc_thresholds,
|
| const VisualizationParams* visualization_params) {
|
| // Codec/config settings.
|
| start_bitrate_ = rate_profile.target_bit_rate[0];
|
| start_frame_rate_ = rate_profile.input_frame_rate[0];
|
| - packet_loss_ = process.packet_loss;
|
| + packet_loss_probability_ = process.packet_loss_probability;
|
| num_temporal_layers_ = process.num_temporal_layers;
|
| SetUpCodecConfig(process, visualization_params);
|
| // Update the layers and the codec with the initial rates.
|
| @@ -548,14 +563,15 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| // update layers and codec with new rates.
|
| if (frame_number ==
|
| rate_profile.frame_index_rate_update[update_index + 1]) {
|
| - VerifyRateControl(
|
| - update_index, rc_metrics[update_index].max_key_frame_size_mismatch,
|
| - rc_metrics[update_index].max_delta_frame_size_mismatch,
|
| - rc_metrics[update_index].max_encoding_rate_mismatch,
|
| - rc_metrics[update_index].max_time_hit_target,
|
| - rc_metrics[update_index].max_num_dropped_frames,
|
| - rc_metrics[update_index].num_spatial_resizes,
|
| - rc_metrics[update_index].num_key_frames);
|
| + VerifyRateControlMetrics(
|
| + update_index,
|
| + rc_thresholds[update_index].max_key_frame_size_mismatch,
|
| + rc_thresholds[update_index].max_delta_frame_size_mismatch,
|
| + rc_thresholds[update_index].max_encoding_rate_mismatch,
|
| + rc_thresholds[update_index].max_time_hit_target,
|
| + rc_thresholds[update_index].max_num_dropped_frames,
|
| + rc_thresholds[update_index].num_spatial_resizes,
|
| + rc_thresholds[update_index].num_key_frames);
|
| // Update layer rates and the codec with new rates.
|
| ++update_index;
|
| bit_rate_ = rate_profile.target_bit_rate[update_index];
|
| @@ -566,14 +582,14 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| processor_->SetRates(bit_rate_, frame_rate_);
|
| }
|
| }
|
| - VerifyRateControl(update_index,
|
| - rc_metrics[update_index].max_key_frame_size_mismatch,
|
| - rc_metrics[update_index].max_delta_frame_size_mismatch,
|
| - rc_metrics[update_index].max_encoding_rate_mismatch,
|
| - rc_metrics[update_index].max_time_hit_target,
|
| - rc_metrics[update_index].max_num_dropped_frames,
|
| - rc_metrics[update_index].num_spatial_resizes,
|
| - rc_metrics[update_index].num_key_frames);
|
| + VerifyRateControlMetrics(
|
| + update_index, rc_thresholds[update_index].max_key_frame_size_mismatch,
|
| + rc_thresholds[update_index].max_delta_frame_size_mismatch,
|
| + rc_thresholds[update_index].max_encoding_rate_mismatch,
|
| + rc_thresholds[update_index].max_time_hit_target,
|
| + rc_thresholds[update_index].max_num_dropped_frames,
|
| + rc_thresholds[update_index].num_spatial_resizes,
|
| + rc_thresholds[update_index].num_key_frames);
|
| EXPECT_EQ(num_frames, frame_number);
|
| EXPECT_EQ(num_frames + 1, static_cast<int>(stats_.stats_.size()));
|
|
|
| @@ -607,10 +623,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| psnr_result.average, psnr_result.min, ssim_result.average,
|
| ssim_result.min);
|
| stats_.PrintSummary();
|
| - EXPECT_GT(psnr_result.average, quality_metrics.minimum_avg_psnr);
|
| - EXPECT_GT(psnr_result.min, quality_metrics.minimum_min_psnr);
|
| - EXPECT_GT(ssim_result.average, quality_metrics.minimum_avg_ssim);
|
| - EXPECT_GT(ssim_result.min, quality_metrics.minimum_min_ssim);
|
| + VerifyQuality(psnr_result, ssim_result, quality_thresholds);
|
|
|
| // Remove analysis file.
|
| if (remove(config_.output_filename.c_str()) < 0) {
|
| @@ -618,25 +631,25 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| }
|
| }
|
|
|
| - static void SetCodecParameters(CodecConfigPars* process_settings,
|
| - VideoCodecType codec_type,
|
| - bool hw_codec,
|
| - bool use_single_core,
|
| - float packet_loss,
|
| - int key_frame_interval,
|
| - int num_temporal_layers,
|
| - bool error_concealment_on,
|
| - bool denoising_on,
|
| - bool frame_dropper_on,
|
| - bool spatial_resize_on,
|
| - int width,
|
| - int height,
|
| - const std::string& filename,
|
| - bool verbose_logging) {
|
| + 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,
|
| + int width,
|
| + int height,
|
| + const std::string& filename,
|
| + bool verbose_logging) {
|
| process_settings->codec_type = codec_type;
|
| process_settings->hw_codec = hw_codec;
|
| process_settings->use_single_core = use_single_core;
|
| - process_settings->packet_loss = packet_loss;
|
| + 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;
|
| @@ -649,65 +662,65 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| process_settings->verbose_logging = verbose_logging;
|
| }
|
|
|
| - static void SetCodecParameters(CodecConfigPars* process_settings,
|
| - VideoCodecType codec_type,
|
| - bool hw_codec,
|
| - bool use_single_core,
|
| - float packet_loss,
|
| - int key_frame_interval,
|
| - int num_temporal_layers,
|
| - bool error_concealment_on,
|
| - bool denoising_on,
|
| - bool frame_dropper_on,
|
| - bool spatial_resize_on) {
|
| - SetCodecParameters(process_settings, codec_type, hw_codec, use_single_core,
|
| - packet_loss, key_frame_interval, num_temporal_layers,
|
| - error_concealment_on, denoising_on, frame_dropper_on,
|
| - spatial_resize_on, kCifWidth, kCifHeight,
|
| - kFilenameForemanCif, false /* verbose_logging */);
|
| + 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) {
|
| + 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, kCifWidth, kCifHeight,
|
| + kFilenameForemanCif, false /* verbose_logging */);
|
| }
|
|
|
| - static void SetQualityMetrics(QualityMetrics* quality_metrics,
|
| - double minimum_avg_psnr,
|
| - double minimum_min_psnr,
|
| - double minimum_avg_ssim,
|
| - double minimum_min_ssim) {
|
| - quality_metrics->minimum_avg_psnr = minimum_avg_psnr;
|
| - quality_metrics->minimum_min_psnr = minimum_min_psnr;
|
| - quality_metrics->minimum_avg_ssim = minimum_avg_ssim;
|
| - quality_metrics->minimum_min_ssim = minimum_min_ssim;
|
| + static void SetQualityThresholds(QualityThresholds* quality_thresholds,
|
| + double min_avg_psnr,
|
| + double min_min_psnr,
|
| + double min_avg_ssim,
|
| + double min_min_ssim) {
|
| + quality_thresholds->min_avg_psnr = min_avg_psnr;
|
| + quality_thresholds->min_min_psnr = min_min_psnr;
|
| + quality_thresholds->min_avg_ssim = min_avg_ssim;
|
| + quality_thresholds->min_min_ssim = min_min_ssim;
|
| }
|
|
|
| - static void SetRateProfilePars(RateProfile* rate_profile,
|
| - int update_index,
|
| - int bit_rate,
|
| - int frame_rate,
|
| - int frame_index_rate_update) {
|
| + static void SetRateProfile(RateProfile* rate_profile,
|
| + int update_index,
|
| + int bit_rate,
|
| + int frame_rate,
|
| + int frame_index_rate_update) {
|
| rate_profile->target_bit_rate[update_index] = bit_rate;
|
| rate_profile->input_frame_rate[update_index] = frame_rate;
|
| rate_profile->frame_index_rate_update[update_index] =
|
| frame_index_rate_update;
|
| }
|
|
|
| - static void SetRateControlMetrics(RateControlMetrics* rc_metrics,
|
| - int update_index,
|
| - int max_num_dropped_frames,
|
| - int max_key_frame_size_mismatch,
|
| - int max_delta_frame_size_mismatch,
|
| - int max_encoding_rate_mismatch,
|
| - int max_time_hit_target,
|
| - int num_spatial_resizes,
|
| - int num_key_frames) {
|
| - rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames;
|
| - rc_metrics[update_index].max_key_frame_size_mismatch =
|
| + static void SetRateControlThresholds(RateControlThresholds* rc_thresholds,
|
| + int update_index,
|
| + int max_num_dropped_frames,
|
| + int max_key_frame_size_mismatch,
|
| + int max_delta_frame_size_mismatch,
|
| + int max_encoding_rate_mismatch,
|
| + int max_time_hit_target,
|
| + int num_spatial_resizes,
|
| + int num_key_frames) {
|
| + rc_thresholds[update_index].max_num_dropped_frames = max_num_dropped_frames;
|
| + rc_thresholds[update_index].max_key_frame_size_mismatch =
|
| max_key_frame_size_mismatch;
|
| - rc_metrics[update_index].max_delta_frame_size_mismatch =
|
| + rc_thresholds[update_index].max_delta_frame_size_mismatch =
|
| max_delta_frame_size_mismatch;
|
| - rc_metrics[update_index].max_encoding_rate_mismatch =
|
| + rc_thresholds[update_index].max_encoding_rate_mismatch =
|
| max_encoding_rate_mismatch;
|
| - rc_metrics[update_index].max_time_hit_target = max_time_hit_target;
|
| - rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes;
|
| - rc_metrics[update_index].num_key_frames = num_key_frames;
|
| + rc_thresholds[update_index].max_time_hit_target = max_time_hit_target;
|
| + rc_thresholds[update_index].num_spatial_resizes = num_spatial_resizes;
|
| + rc_thresholds[update_index].num_key_frames = num_key_frames;
|
| }
|
|
|
| // Codecs.
|
| @@ -758,7 +771,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| int start_frame_rate_;
|
|
|
| // Codec and network settings.
|
| - float packet_loss_;
|
| + float packet_loss_probability_;
|
| int num_temporal_layers_;
|
| };
|
|
|
|
|