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_; |
}; |