| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H
_ | 11 #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H
_ |
| 12 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H
_ | 12 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H
_ |
| 13 | 13 |
| 14 #include <math.h> | 14 #include <math.h> |
| 15 | 15 |
| 16 #include <limits> |
| 16 #include <memory> | 17 #include <memory> |
| 17 #include <string> | 18 #include <string> |
| 18 #include <utility> | 19 #include <utility> |
| 19 | 20 |
| 20 #if defined(WEBRTC_ANDROID) | 21 #if defined(WEBRTC_ANDROID) |
| 21 #include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h" | 22 #include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h" |
| 22 #include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h" | 23 #include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h" |
| 23 #include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h" | 24 #include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h" |
| 24 #elif defined(WEBRTC_IOS) | 25 #elif defined(WEBRTC_IOS) |
| 25 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h" | 26 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 std::string filename; | 87 std::string filename; |
| 87 bool verbose_logging; | 88 bool verbose_logging; |
| 88 | 89 |
| 89 // In batch mode, the VideoProcessor is fed all the frames for processing | 90 // In batch mode, the VideoProcessor is fed all the frames for processing |
| 90 // before any metrics are calculated. This is useful for pipelining HW codecs, | 91 // before any metrics are calculated. This is useful for pipelining HW codecs, |
| 91 // for which some calculated metrics otherwise would be incorrect. The | 92 // for which some calculated metrics otherwise would be incorrect. The |
| 92 // downside with batch mode is that mid-test rate allocation is not supported. | 93 // downside with batch mode is that mid-test rate allocation is not supported. |
| 93 bool batch_mode; | 94 bool batch_mode; |
| 94 }; | 95 }; |
| 95 | 96 |
| 96 // Thresholds for the quality metrics. | 97 // Thresholds for the quality metrics. Defaults are maximally minimal. |
| 97 struct QualityThresholds { | 98 struct QualityThresholds { |
| 98 double min_avg_psnr; | 99 double min_avg_psnr = std::numeric_limits<double>::min(); |
| 99 double min_min_psnr; | 100 double min_min_psnr = std::numeric_limits<double>::min(); |
| 100 double min_avg_ssim; | 101 double min_avg_ssim = 0; |
| 101 double min_min_ssim; | 102 double min_min_ssim = 0; |
| 102 }; | 103 }; |
| 103 | 104 |
| 104 // The sequence of bit rate and frame rate changes for the encoder, the frame | 105 // The sequence of bit rate and frame rate changes for the encoder, the frame |
| 105 // number where the changes are made, and the total number of frames for the | 106 // number where the changes are made, and the total number of frames for the |
| 106 // test. | 107 // test. |
| 107 struct RateProfile { | 108 struct RateProfile { |
| 108 int target_bit_rate[kMaxNumRateUpdates]; | 109 int target_bit_rate[kMaxNumRateUpdates]; |
| 109 int input_frame_rate[kMaxNumRateUpdates]; | 110 int input_frame_rate[kMaxNumRateUpdates]; |
| 110 int frame_index_rate_update[kMaxNumRateUpdates + 1]; | 111 int frame_index_rate_update[kMaxNumRateUpdates + 1]; |
| 111 int num_frames; | 112 int num_frames; |
| 112 }; | 113 }; |
| 113 | 114 |
| 114 // Thresholds for the rate control metrics. The rate mismatch thresholds are | 115 // Thresholds for the rate control metrics. The rate mismatch thresholds are |
| 115 // defined as percentages. |max_time_hit_target| is defined as number of frames, | 116 // defined as percentages. |max_time_hit_target| is defined as number of frames, |
| 116 // after a rate update is made to the encoder, for the encoder to reach within | 117 // after a rate update is made to the encoder, for the encoder to reach within |
| 117 // |kPercTargetvsActualMismatch| of new target rate. The thresholds are defined | 118 // |kPercTargetvsActualMismatch| of new target rate. The thresholds are defined |
| 118 // for each rate update sequence. | 119 // for each rate update sequence. |
| 119 struct RateControlThresholds { | 120 struct RateControlThresholds { |
| 120 int max_num_dropped_frames; | 121 int max_num_dropped_frames; |
| 121 int max_key_frame_size_mismatch; | 122 int max_key_frame_size_mismatch; |
| 122 int max_delta_frame_size_mismatch; | 123 int max_delta_frame_size_mismatch; |
| 123 int max_encoding_rate_mismatch; | 124 int max_encoding_rate_mismatch; |
| 124 int max_time_hit_target; | 125 int max_time_hit_target; |
| 125 int num_spatial_resizes; | 126 int num_spatial_resizes; // Set to -1 to disable check. |
| 126 int num_key_frames; | 127 int num_key_frames; // Set to -1 to disable check. |
| 127 }; | 128 }; |
| 128 | 129 |
| 129 // Should video files be saved persistently to disk for post-run visualization? | 130 // Should video files be saved persistently to disk for post-run visualization? |
| 130 struct VisualizationParams { | 131 struct VisualizationParams { |
| 131 bool save_source_y4m; | 132 bool save_source_y4m; |
| 132 bool save_encoded_ivf; | 133 bool save_encoded_ivf; |
| 133 bool save_decoded_y4m; | 134 bool save_decoded_y4m; |
| 134 }; | 135 }; |
| 135 | 136 |
| 136 #if !defined(WEBRTC_IOS) | 137 #if !defined(WEBRTC_IOS) |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 encoding_bitrate_[i], perc_frame_size_mismatch, | 468 encoding_bitrate_[i], perc_frame_size_mismatch, |
| 468 perc_encoding_rate_mismatch, num_frames_per_update_[i]); | 469 perc_encoding_rate_mismatch, num_frames_per_update_[i]); |
| 469 EXPECT_LE(perc_frame_size_mismatch, | 470 EXPECT_LE(perc_frame_size_mismatch, |
| 470 rc_expected.max_delta_frame_size_mismatch); | 471 rc_expected.max_delta_frame_size_mismatch); |
| 471 EXPECT_LE(perc_encoding_rate_mismatch, | 472 EXPECT_LE(perc_encoding_rate_mismatch, |
| 472 rc_expected.max_encoding_rate_mismatch); | 473 rc_expected.max_encoding_rate_mismatch); |
| 473 } | 474 } |
| 474 printf("\n"); | 475 printf("\n"); |
| 475 EXPECT_LE(num_frames_to_hit_target_, rc_expected.max_time_hit_target); | 476 EXPECT_LE(num_frames_to_hit_target_, rc_expected.max_time_hit_target); |
| 476 EXPECT_LE(num_dropped_frames, rc_expected.max_num_dropped_frames); | 477 EXPECT_LE(num_dropped_frames, rc_expected.max_num_dropped_frames); |
| 477 EXPECT_EQ(rc_expected.num_spatial_resizes, num_resize_actions); | 478 if (rc_expected.num_spatial_resizes >= 0) { |
| 478 EXPECT_EQ(rc_expected.num_key_frames, num_key_frames_); | 479 EXPECT_EQ(rc_expected.num_spatial_resizes, num_resize_actions); |
| 480 } |
| 481 if (rc_expected.num_key_frames >= 0) { |
| 482 EXPECT_EQ(rc_expected.num_key_frames, num_key_frames_); |
| 483 } |
| 479 } | 484 } |
| 480 | 485 |
| 481 void VerifyQuality(const test::QualityMetricsResult& psnr_result, | 486 void VerifyQuality(const test::QualityMetricsResult& psnr_result, |
| 482 const test::QualityMetricsResult& ssim_result, | 487 const test::QualityMetricsResult& ssim_result, |
| 483 const QualityThresholds& quality_thresholds) { | 488 const QualityThresholds& quality_thresholds) { |
| 484 EXPECT_GT(psnr_result.average, quality_thresholds.min_avg_psnr); | 489 EXPECT_GT(psnr_result.average, quality_thresholds.min_avg_psnr); |
| 485 EXPECT_GT(psnr_result.min, quality_thresholds.min_min_psnr); | 490 EXPECT_GT(psnr_result.min, quality_thresholds.min_min_psnr); |
| 486 EXPECT_GT(ssim_result.average, quality_thresholds.min_avg_ssim); | 491 EXPECT_GT(ssim_result.average, quality_thresholds.min_avg_ssim); |
| 487 EXPECT_GT(ssim_result.min, quality_thresholds.min_min_ssim); | 492 EXPECT_GT(ssim_result.min, quality_thresholds.min_min_ssim); |
| 488 } | 493 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 } | 539 } |
| 535 frame_rate_layer_[i] = | 540 frame_rate_layer_[i] = |
| 536 frame_rate_ / static_cast<float>(1 << (num_temporal_layers_ - 1)); | 541 frame_rate_ / static_cast<float>(1 << (num_temporal_layers_ - 1)); |
| 537 } | 542 } |
| 538 if (num_temporal_layers_ == 3) { | 543 if (num_temporal_layers_ == 3) { |
| 539 frame_rate_layer_[2] = frame_rate_ / 2.0f; | 544 frame_rate_layer_[2] = frame_rate_ / 2.0f; |
| 540 } | 545 } |
| 541 } | 546 } |
| 542 | 547 |
| 543 // Processes all frames in the clip and verifies the result. | 548 // Processes all frames in the clip and verifies the result. |
| 549 // TODO(brandtr): Change the second last argument to be a |
| 550 // const std::vector<RateControlThresholds>&, so we can ensure that the user |
| 551 // does not expect us to do mid-clip rate updates when we are not able to, |
| 552 // e.g., when we are operating in batch mode. |
| 544 void ProcessFramesAndVerify(QualityThresholds quality_thresholds, | 553 void ProcessFramesAndVerify(QualityThresholds quality_thresholds, |
| 545 RateProfile rate_profile, | 554 RateProfile rate_profile, |
| 546 CodecParams process, | 555 CodecParams process, |
| 547 RateControlThresholds* rc_thresholds, | 556 RateControlThresholds* rc_thresholds, |
| 548 const VisualizationParams* visualization_params) { | 557 const VisualizationParams* visualization_params) { |
| 549 // Codec/config settings. | 558 // Codec/config settings. |
| 550 start_bitrate_ = rate_profile.target_bit_rate[0]; | 559 start_bitrate_ = rate_profile.target_bit_rate[0]; |
| 551 start_frame_rate_ = rate_profile.input_frame_rate[0]; | 560 start_frame_rate_ = rate_profile.input_frame_rate[0]; |
| 552 packet_loss_probability_ = process.packet_loss_probability; | 561 packet_loss_probability_ = process.packet_loss_probability; |
| 553 num_temporal_layers_ = process.num_temporal_layers; | 562 num_temporal_layers_ = process.num_temporal_layers; |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 808 | 817 |
| 809 // Codec and network settings. | 818 // Codec and network settings. |
| 810 float packet_loss_probability_; | 819 float packet_loss_probability_; |
| 811 int num_temporal_layers_; | 820 int num_temporal_layers_; |
| 812 }; | 821 }; |
| 813 | 822 |
| 814 } // namespace test | 823 } // namespace test |
| 815 } // namespace webrtc | 824 } // namespace webrtc |
| 816 | 825 |
| 817 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTES
T_H_ | 826 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTES
T_H_ |
| OLD | NEW |