| 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 55bc4efae4c45c15dc638c18982ce404fdc84062..d8a6c523e63c7245b1fedbc81629bb254e8651a8 100644
|
| --- a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
|
| +++ b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
|
| @@ -86,6 +86,12 @@ struct CodecParams {
|
| std::string filename;
|
| bool verbose_logging;
|
|
|
| + // In correctness mode, EXPECTs are enabled for comparing the quality and
|
| + // rate control metrics to their respective thresholds. It can be useful to
|
| + // turn off correctness mode for HW codecs, since these in general are less
|
| + // reliable than SW codecs, and failing an EXPECT will fail the entire test.
|
| + bool correctness_mode;
|
| +
|
| // In batch mode, the VideoProcessor is fed all the frames for processing
|
| // before any metrics are calculated. This is useful for pipelining HW codecs,
|
| // for which some calculated metrics otherwise would be incorrect. The
|
| @@ -422,6 +428,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| void VerifyRateControlMetrics(int update_index,
|
| int num_dropped_frames,
|
| int num_resize_actions,
|
| + bool correctness_mode,
|
| const RateControlThresholds& rc_expected) {
|
| printf(
|
| "For update #: %d,\n"
|
| @@ -434,8 +441,10 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| " Number of dropped frames: %d, \n"
|
| " Number of spatial resizes: %d, \n",
|
| num_frames_to_hit_target_, num_dropped_frames, num_resize_actions);
|
| - EXPECT_LE(perc_encoding_rate_mismatch_,
|
| - rc_expected.max_encoding_rate_mismatch);
|
| + if (correctness_mode) {
|
| + EXPECT_LE(perc_encoding_rate_mismatch_,
|
| + rc_expected.max_encoding_rate_mismatch);
|
| + }
|
| if (num_key_frames_ > 0) {
|
| int perc_key_frame_size_mismatch =
|
| 100 * sum_key_frame_size_mismatch_ / num_key_frames_;
|
| @@ -443,8 +452,10 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| " Number of Key frames: %d \n"
|
| " Key frame rate mismatch: %d \n",
|
| num_key_frames_, perc_key_frame_size_mismatch);
|
| - EXPECT_LE(perc_key_frame_size_mismatch,
|
| - rc_expected.max_key_frame_size_mismatch);
|
| + if (correctness_mode) {
|
| + EXPECT_LE(perc_key_frame_size_mismatch,
|
| + rc_expected.max_key_frame_size_mismatch);
|
| + }
|
| }
|
| printf("\n");
|
| printf("Rates statistics for Layer data \n");
|
| @@ -466,16 +477,20 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| bit_rate_layer_[i], frame_rate_layer_[i], per_frame_bandwidth_[i],
|
| encoding_bitrate_[i], perc_frame_size_mismatch,
|
| perc_encoding_rate_mismatch, num_frames_per_update_[i]);
|
| - EXPECT_LE(perc_frame_size_mismatch,
|
| - rc_expected.max_delta_frame_size_mismatch);
|
| - EXPECT_LE(perc_encoding_rate_mismatch,
|
| - rc_expected.max_encoding_rate_mismatch);
|
| + if (correctness_mode) {
|
| + EXPECT_LE(perc_frame_size_mismatch,
|
| + rc_expected.max_delta_frame_size_mismatch);
|
| + EXPECT_LE(perc_encoding_rate_mismatch,
|
| + rc_expected.max_encoding_rate_mismatch);
|
| + }
|
| }
|
| printf("\n");
|
| - EXPECT_LE(num_frames_to_hit_target_, rc_expected.max_time_hit_target);
|
| - EXPECT_LE(num_dropped_frames, rc_expected.max_num_dropped_frames);
|
| - EXPECT_EQ(rc_expected.num_spatial_resizes, num_resize_actions);
|
| - EXPECT_EQ(rc_expected.num_key_frames, num_key_frames_);
|
| + if (correctness_mode) {
|
| + EXPECT_LE(num_frames_to_hit_target_, rc_expected.max_time_hit_target);
|
| + EXPECT_LE(num_dropped_frames, rc_expected.max_num_dropped_frames);
|
| + EXPECT_EQ(rc_expected.num_spatial_resizes, num_resize_actions);
|
| + EXPECT_EQ(rc_expected.num_key_frames, num_key_frames_);
|
| + }
|
| }
|
|
|
| void VerifyQuality(const test::QualityMetricsResult& psnr_result,
|
| @@ -592,6 +607,15 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| // In online mode, we calculate the metrics for a given frame right after
|
| // it has been sent for encoding.
|
|
|
| + if (!process.correctness_mode) {
|
| + // This is a check that we do not disable correctness mode by mistake
|
| + // on the bots. When doing manual experimentation and correctness mode
|
| + // is not desired, the check can be commented out.
|
| + RTC_NOTREACHED() << "This test is set up to run with both correctness "
|
| + "mode and batch mode disabled. Are you sure you "
|
| + "want to do that? In particular, this should never "
|
| + "happen on the bots.";
|
| + }
|
| if (process.hw_codec) {
|
| LOG(LS_WARNING) << "HW codecs should mostly be run in batch mode, "
|
| "since they may be pipelining.";
|
| @@ -615,7 +639,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| int num_dropped_frames = processor_->NumberDroppedFrames();
|
| int num_resize_actions = processor_->NumberSpatialResizes();
|
| VerifyRateControlMetrics(update_index, num_dropped_frames,
|
| - num_resize_actions,
|
| + num_resize_actions, process.correctness_mode,
|
| rc_thresholds[update_index]);
|
|
|
| // Update layer rates and the codec with new rates.
|
| @@ -640,7 +664,8 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| int num_dropped_frames = processor_->NumberDroppedFrames();
|
| int num_resize_actions = processor_->NumberSpatialResizes();
|
| VerifyRateControlMetrics(update_index, num_dropped_frames,
|
| - num_resize_actions, rc_thresholds[update_index]);
|
| + num_resize_actions, process.correctness_mode,
|
| + rc_thresholds[update_index]);
|
| EXPECT_EQ(num_frames, frame_number);
|
| EXPECT_EQ(num_frames + 1, static_cast<int>(stats_.stats_.size()));
|
|
|
| @@ -669,7 +694,9 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| printf("PSNR avg: %f, min: %f\nSSIM avg: %f, min: %f\n",
|
| psnr_result.average, psnr_result.min, ssim_result.average,
|
| ssim_result.min);
|
| - VerifyQuality(psnr_result, ssim_result, quality_thresholds);
|
| + if (process.correctness_mode) {
|
| + VerifyQuality(psnr_result, ssim_result, quality_thresholds);
|
| + }
|
| stats_.PrintSummary();
|
|
|
| // Remove analysis file.
|
| @@ -693,6 +720,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| int height,
|
| const std::string& filename,
|
| bool verbose_logging,
|
| + bool correctness_mode,
|
| bool batch_mode) {
|
| process_settings->codec_type = codec_type;
|
| process_settings->hw_codec = hw_codec;
|
| @@ -708,6 +736,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| process_settings->height = height;
|
| process_settings->filename = filename;
|
| process_settings->verbose_logging = verbose_logging;
|
| + process_settings->correctness_mode = correctness_mode;
|
| process_settings->batch_mode = batch_mode;
|
| }
|
|
|
| @@ -727,7 +756,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
|
| num_temporal_layers, error_concealment_on, denoising_on,
|
| frame_dropper_on, spatial_resize_on, kCifWidth, kCifHeight,
|
| kFilenameForemanCif, false /* verbose_logging */,
|
| - false /* batch_mode */);
|
| + true /* correctness_mode */, false /* batch_mode */);
|
| }
|
|
|
| static void SetQualityThresholds(QualityThresholds* quality_thresholds,
|
|
|