Chromium Code Reviews| 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..4d7fbfb75ef32dcf1ccd0ccb1ce58d46680eb77f 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; |
|
sprang_webrtc
2017/02/22 16:39:31
packet_loss_perecent? or fraction?
brandtr
2017/02/23 08:16:45
Fixed :)
|
| + |
| 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) |
| @@ -393,14 +398,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 +459,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,10 +519,10 @@ 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]; |
| @@ -548,14 +562,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 +581,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 +622,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,21 +630,21 @@ 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, |
| + 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; |
| @@ -649,65 +661,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, |
| + 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, 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. |