Chromium Code Reviews| 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 _ | |
| 12 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H _ | |
| 13 | |
| 11 #include <math.h> | 14 #include <math.h> |
| 12 | 15 |
| 13 #include <memory> | 16 #include <memory> |
| 17 #include <string> | |
| 14 | 18 |
| 15 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" | 19 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" |
| 16 #include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h" | 20 #include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h" |
| 17 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h" | 21 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h" |
| 18 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" | 22 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" |
| 19 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" | 23 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" |
| 20 #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h" | 24 #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h" |
| 21 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" | 25 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" |
| 22 #include "webrtc/modules/video_coding/include/video_codec_interface.h" | 26 #include "webrtc/modules/video_coding/include/video_codec_interface.h" |
| 23 #include "webrtc/modules/video_coding/include/video_coding.h" | 27 #include "webrtc/modules/video_coding/include/video_coding.h" |
| 24 #include "webrtc/test/gtest.h" | 28 #include "webrtc/test/gtest.h" |
| 25 #include "webrtc/test/testsupport/fileutils.h" | 29 #include "webrtc/test/testsupport/fileutils.h" |
| 26 #include "webrtc/test/testsupport/frame_reader.h" | 30 #include "webrtc/test/testsupport/frame_reader.h" |
| 27 #include "webrtc/test/testsupport/frame_writer.h" | 31 #include "webrtc/test/testsupport/frame_writer.h" |
| 28 #include "webrtc/test/testsupport/metrics/video_metrics.h" | 32 #include "webrtc/test/testsupport/metrics/video_metrics.h" |
| 29 #include "webrtc/test/testsupport/packet_reader.h" | 33 #include "webrtc/test/testsupport/packet_reader.h" |
| 30 #include "webrtc/typedefs.h" | 34 #include "webrtc/typedefs.h" |
| 31 | 35 |
| 32 namespace webrtc { | 36 namespace webrtc { |
| 33 namespace { | 37 namespace test { |
| 34 // Maximum number of rate updates (i.e., calls to encoder to change bitrate | 38 // Maximum number of rate updates (i.e., calls to encoder to change bitrate |
| 35 // and/or frame rate) for the current tests. | 39 // and/or frame rate) for the current tests. |
| 36 const int kMaxNumRateUpdates = 3; | 40 const int kMaxNumRateUpdates = 3; |
| 37 | 41 |
| 38 const int kPercTargetvsActualMismatch = 20; | 42 const int kPercTargetvsActualMismatch = 20; |
| 39 const int kBaseKeyFrameInterval = 3000; | 43 const int kBaseKeyFrameInterval = 3000; |
| 40 | 44 |
| 45 // Default sequence is foreman (CIF): may be better to use VGA for resize test. | |
| 46 const int kCifWidth = 352; | |
| 47 const int kCifHeight = 288; | |
| 48 const char kFilenameForemanCif[] = "foreman_cif"; | |
| 49 | |
| 41 // Codec and network settings. | 50 // Codec and network settings. |
| 42 struct CodecConfigPars { | 51 struct CodecConfigPars { |
| 43 VideoCodecType codec_type; | 52 VideoCodecType codec_type; |
| 44 float packet_loss; | 53 float packet_loss; |
| 45 int num_temporal_layers; | 54 int num_temporal_layers; |
| 46 int key_frame_interval; | 55 int key_frame_interval; |
| 47 bool error_concealment_on; | 56 bool error_concealment_on; |
| 48 bool denoising_on; | 57 bool denoising_on; |
| 49 bool frame_dropper_on; | 58 bool frame_dropper_on; |
| 50 bool spatial_resize_on; | 59 bool spatial_resize_on; |
| 60 int width; | |
| 61 int height; | |
| 62 std::string filename; | |
| 63 bool verbose_logging; | |
| 51 }; | 64 }; |
| 52 | 65 |
| 53 // Quality metrics. | 66 // Quality metrics. |
| 54 struct QualityMetrics { | 67 struct QualityMetrics { |
| 55 double minimum_avg_psnr; | 68 double minimum_avg_psnr; |
| 56 double minimum_min_psnr; | 69 double minimum_min_psnr; |
| 57 double minimum_avg_ssim; | 70 double minimum_avg_ssim; |
| 58 double minimum_min_ssim; | 71 double minimum_min_ssim; |
| 59 }; | 72 }; |
| 60 | 73 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 76 struct RateControlMetrics { | 89 struct RateControlMetrics { |
| 77 int max_num_dropped_frames; | 90 int max_num_dropped_frames; |
| 78 int max_key_frame_size_mismatch; | 91 int max_key_frame_size_mismatch; |
| 79 int max_delta_frame_size_mismatch; | 92 int max_delta_frame_size_mismatch; |
| 80 int max_encoding_rate_mismatch; | 93 int max_encoding_rate_mismatch; |
| 81 int max_time_hit_target; | 94 int max_time_hit_target; |
| 82 int num_spatial_resizes; | 95 int num_spatial_resizes; |
| 83 int num_key_frames; | 96 int num_key_frames; |
| 84 }; | 97 }; |
| 85 | 98 |
| 86 // Sequence used is foreman (CIF): may be better to use VGA for resize test. | |
| 87 const int kCIFWidth = 352; | |
| 88 const int kCIFHeight = 288; | |
| 89 #if !defined(WEBRTC_IOS) | 99 #if !defined(WEBRTC_IOS) |
| 90 const int kNbrFramesShort = 100; // Some tests are run for shorter sequence. | 100 const int kNbrFramesShort = 100; // Some tests are run for shorter sequence. |
| 91 #endif | 101 #endif |
| 92 const int kNbrFramesLong = 299; | 102 const int kNbrFramesLong = 299; |
| 93 | 103 |
| 94 // Parameters from VP8 wrapper, which control target size of key frames. | 104 // Parameters from VP8 wrapper, which control target size of key frames. |
| 95 const float kInitialBufferSize = 0.5f; | 105 const float kInitialBufferSize = 0.5f; |
| 96 const float kOptimalBufferSize = 0.6f; | 106 const float kOptimalBufferSize = 0.6f; |
| 97 const float kScaleKeyFrameSize = 0.5f; | 107 const float kScaleKeyFrameSize = 0.5f; |
| 98 | 108 |
| 99 void SetRateProfilePars(RateProfile* rate_profile, | |
| 100 int update_index, | |
| 101 int bit_rate, | |
| 102 int frame_rate, | |
| 103 int frame_index_rate_update) { | |
| 104 rate_profile->target_bit_rate[update_index] = bit_rate; | |
| 105 rate_profile->input_frame_rate[update_index] = frame_rate; | |
| 106 rate_profile->frame_index_rate_update[update_index] = frame_index_rate_update; | |
| 107 } | |
| 108 | |
| 109 void SetCodecParameters(CodecConfigPars* process_settings, | |
| 110 VideoCodecType codec_type, | |
| 111 float packet_loss, | |
| 112 int key_frame_interval, | |
| 113 int num_temporal_layers, | |
| 114 bool error_concealment_on, | |
| 115 bool denoising_on, | |
| 116 bool frame_dropper_on, | |
| 117 bool spatial_resize_on) { | |
| 118 process_settings->codec_type = codec_type; | |
| 119 process_settings->packet_loss = packet_loss; | |
| 120 process_settings->key_frame_interval = key_frame_interval; | |
| 121 process_settings->num_temporal_layers = num_temporal_layers, | |
| 122 process_settings->error_concealment_on = error_concealment_on; | |
| 123 process_settings->denoising_on = denoising_on; | |
| 124 process_settings->frame_dropper_on = frame_dropper_on; | |
| 125 process_settings->spatial_resize_on = spatial_resize_on; | |
| 126 } | |
| 127 | |
| 128 void SetQualityMetrics(QualityMetrics* quality_metrics, | |
| 129 double minimum_avg_psnr, | |
| 130 double minimum_min_psnr, | |
| 131 double minimum_avg_ssim, | |
| 132 double minimum_min_ssim) { | |
| 133 quality_metrics->minimum_avg_psnr = minimum_avg_psnr; | |
| 134 quality_metrics->minimum_min_psnr = minimum_min_psnr; | |
| 135 quality_metrics->minimum_avg_ssim = minimum_avg_ssim; | |
| 136 quality_metrics->minimum_min_ssim = minimum_min_ssim; | |
| 137 } | |
| 138 | |
| 139 void SetRateControlMetrics(RateControlMetrics* rc_metrics, | |
| 140 int update_index, | |
| 141 int max_num_dropped_frames, | |
| 142 int max_key_frame_size_mismatch, | |
| 143 int max_delta_frame_size_mismatch, | |
| 144 int max_encoding_rate_mismatch, | |
| 145 int max_time_hit_target, | |
| 146 int num_spatial_resizes, | |
| 147 int num_key_frames) { | |
| 148 rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames; | |
| 149 rc_metrics[update_index].max_key_frame_size_mismatch = | |
| 150 max_key_frame_size_mismatch; | |
| 151 rc_metrics[update_index].max_delta_frame_size_mismatch = | |
| 152 max_delta_frame_size_mismatch; | |
| 153 rc_metrics[update_index].max_encoding_rate_mismatch = | |
| 154 max_encoding_rate_mismatch; | |
| 155 rc_metrics[update_index].max_time_hit_target = max_time_hit_target; | |
| 156 rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes; | |
| 157 rc_metrics[update_index].num_key_frames = num_key_frames; | |
| 158 } | |
| 159 } // namespace | |
| 160 | |
| 161 // Integration test for video processor. Encodes+decodes a clip and | 109 // Integration test for video processor. Encodes+decodes a clip and |
| 162 // writes it to the output directory. After completion, quality metrics | 110 // writes it to the output directory. After completion, quality metrics |
| 163 // (PSNR and SSIM) and rate control metrics are computed to verify that the | 111 // (PSNR and SSIM) and rate control metrics are computed to verify that the |
| 164 // quality and encoder response is acceptable. The rate control tests allow us | 112 // quality and encoder response is acceptable. The rate control tests allow us |
| 165 // to verify the behavior for changing bitrate, changing frame rate, frame | 113 // to verify the behavior for changing bitrate, changing frame rate, frame |
| 166 // dropping/spatial resize, and temporal layers. The limits for the rate | 114 // dropping/spatial resize, and temporal layers. The limits for the rate |
| 167 // control metrics are set to be fairly conservative, so failure should only | 115 // control metrics are set to be fairly conservative, so failure should only |
| 168 // happen when some significant regression or breakdown occurs. | 116 // happen when some significant regression or breakdown occurs. |
| 169 class VideoProcessorIntegrationTest : public testing::Test { | 117 class VideoProcessorIntegrationTest : public testing::Test { |
| 170 protected: | 118 protected: |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 210 int num_temporal_layers_; | 158 int num_temporal_layers_; |
| 211 int key_frame_interval_; | 159 int key_frame_interval_; |
| 212 bool error_concealment_on_; | 160 bool error_concealment_on_; |
| 213 bool denoising_on_; | 161 bool denoising_on_; |
| 214 bool frame_dropper_on_; | 162 bool frame_dropper_on_; |
| 215 bool spatial_resize_on_; | 163 bool spatial_resize_on_; |
| 216 | 164 |
| 217 VideoProcessorIntegrationTest() {} | 165 VideoProcessorIntegrationTest() {} |
| 218 virtual ~VideoProcessorIntegrationTest() {} | 166 virtual ~VideoProcessorIntegrationTest() {} |
| 219 | 167 |
| 220 void SetUpCodecConfig() { | 168 void SetUpCodecConfig(const std::string& filename, |
| 169 int width, | |
| 170 int height, | |
| 171 bool verbose_logging) { | |
| 221 if (codec_type_ == kVideoCodecH264) { | 172 if (codec_type_ == kVideoCodecH264) { |
| 222 encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264"))); | 173 encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264"))); |
| 223 decoder_.reset(H264Decoder::Create()); | 174 decoder_.reset(H264Decoder::Create()); |
| 224 VideoCodingModule::Codec(kVideoCodecH264, &codec_settings_); | 175 VideoCodingModule::Codec(kVideoCodecH264, &codec_settings_); |
| 225 } else if (codec_type_ == kVideoCodecVP8) { | 176 } else if (codec_type_ == kVideoCodecVP8) { |
| 226 encoder_.reset(VP8Encoder::Create()); | 177 encoder_.reset(VP8Encoder::Create()); |
| 227 decoder_.reset(VP8Decoder::Create()); | 178 decoder_.reset(VP8Decoder::Create()); |
| 228 VideoCodingModule::Codec(kVideoCodecVP8, &codec_settings_); | 179 VideoCodingModule::Codec(kVideoCodecVP8, &codec_settings_); |
| 229 } else if (codec_type_ == kVideoCodecVP9) { | 180 } else if (codec_type_ == kVideoCodecVP9) { |
| 230 encoder_.reset(VP9Encoder::Create()); | 181 encoder_.reset(VP9Encoder::Create()); |
| 231 decoder_.reset(VP9Decoder::Create()); | 182 decoder_.reset(VP9Decoder::Create()); |
| 232 VideoCodingModule::Codec(kVideoCodecVP9, &codec_settings_); | 183 VideoCodingModule::Codec(kVideoCodecVP9, &codec_settings_); |
| 233 } | 184 } |
| 234 | 185 |
| 235 // CIF is currently used for all tests below. | 186 // Configure input filename. |
| 236 // Setup the TestConfig struct for processing of a clip in CIF resolution. | 187 config_.input_filename = test::ResourcePath(filename, "yuv"); |
| 237 config_.input_filename = webrtc::test::ResourcePath("foreman_cif", "yuv"); | 188 if (verbose_logging) |
| 238 | 189 printf("Filename: %s\n", filename.c_str()); |
| 239 // Generate an output filename in a safe way. | 190 // Generate an output filename in a safe way. |
| 240 config_.output_filename = webrtc::test::TempFilename( | 191 config_.output_filename = test::TempFilename( |
| 241 webrtc::test::OutputPath(), "videoprocessor_integrationtest"); | 192 test::OutputPath(), "videoprocessor_integrationtest"); |
| 242 config_.frame_length_in_bytes = | 193 config_.frame_length_in_bytes = CalcBufferSize(kI420, width, height); |
| 243 CalcBufferSize(kI420, kCIFWidth, kCIFHeight); | 194 config_.verbose = verbose_logging; |
| 244 config_.verbose = false; | |
| 245 // Only allow encoder/decoder to use single core, for predictability. | 195 // Only allow encoder/decoder to use single core, for predictability. |
| 246 config_.use_single_core = true; | 196 config_.use_single_core = true; |
| 247 // Key frame interval and packet loss are set for each test. | 197 // Key frame interval and packet loss are set for each test. |
| 248 config_.keyframe_interval = key_frame_interval_; | 198 config_.keyframe_interval = key_frame_interval_; |
| 249 config_.networking_config.packet_loss_probability = packet_loss_; | 199 config_.networking_config.packet_loss_probability = packet_loss_; |
| 250 | 200 |
| 251 // Configure codec settings. | 201 // Configure codec settings. |
| 252 config_.codec_settings = &codec_settings_; | 202 config_.codec_settings = &codec_settings_; |
| 253 config_.codec_settings->startBitrate = start_bitrate_; | 203 config_.codec_settings->startBitrate = start_bitrate_; |
| 254 config_.codec_settings->width = kCIFWidth; | 204 config_.codec_settings->width = width; |
| 255 config_.codec_settings->height = kCIFHeight; | 205 config_.codec_settings->height = height; |
| 256 | 206 |
| 257 // These features may be set depending on the test. | 207 // These features may be set depending on the test. |
| 258 switch (config_.codec_settings->codecType) { | 208 switch (config_.codec_settings->codecType) { |
| 259 case kVideoCodecH264: | 209 case kVideoCodecH264: |
| 260 config_.codec_settings->H264()->frameDroppingOn = frame_dropper_on_; | 210 config_.codec_settings->H264()->frameDroppingOn = frame_dropper_on_; |
| 261 config_.codec_settings->H264()->keyFrameInterval = | 211 config_.codec_settings->H264()->keyFrameInterval = |
| 262 kBaseKeyFrameInterval; | 212 kBaseKeyFrameInterval; |
| 263 break; | 213 break; |
| 264 case kVideoCodecVP8: | 214 case kVideoCodecVP8: |
| 265 config_.codec_settings->VP8()->errorConcealmentOn = | 215 config_.codec_settings->VP8()->errorConcealmentOn = |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 int max_key_frame_size_mismatch, | 320 int max_key_frame_size_mismatch, |
| 371 int max_delta_frame_size_mismatch, | 321 int max_delta_frame_size_mismatch, |
| 372 int max_encoding_rate_mismatch, | 322 int max_encoding_rate_mismatch, |
| 373 int max_time_hit_target, | 323 int max_time_hit_target, |
| 374 int max_num_dropped_frames, | 324 int max_num_dropped_frames, |
| 375 int num_spatial_resizes, | 325 int num_spatial_resizes, |
| 376 int num_key_frames) { | 326 int num_key_frames) { |
| 377 int num_dropped_frames = processor_->NumberDroppedFrames(); | 327 int num_dropped_frames = processor_->NumberDroppedFrames(); |
| 378 int num_resize_actions = processor_->NumberSpatialResizes(); | 328 int num_resize_actions = processor_->NumberSpatialResizes(); |
| 379 printf( | 329 printf( |
| 380 "For update #: %d,\n " | 330 "For update #: %d,\n" |
| 381 " Target Bitrate: %d,\n" | 331 " Target Bitrate: %d,\n" |
| 382 " Encoding bitrate: %f,\n" | 332 " Encoding bitrate: %f,\n" |
| 383 " Frame rate: %d \n", | 333 " Frame rate: %d \n", |
| 384 update_index, bit_rate_, encoding_bitrate_total_, frame_rate_); | 334 update_index, bit_rate_, encoding_bitrate_total_, frame_rate_); |
| 385 printf( | 335 printf( |
| 386 " Number of frames to approach target rate: %d, \n" | 336 " Number of frames to approach target rate: %d, \n" |
| 387 " Number of dropped frames: %d, \n" | 337 " Number of dropped frames: %d, \n" |
| 388 " Number of spatial resizes: %d, \n", | 338 " Number of spatial resizes: %d, \n", |
| 389 num_frames_to_hit_target_, num_dropped_frames, num_resize_actions); | 339 num_frames_to_hit_target_, num_dropped_frames, num_resize_actions); |
| 390 EXPECT_LE(perc_encoding_rate_mismatch_, max_encoding_rate_mismatch); | 340 EXPECT_LE(perc_encoding_rate_mismatch_, max_encoding_rate_mismatch); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 485 // Codec/config settings. | 435 // Codec/config settings. |
| 486 codec_type_ = process.codec_type; | 436 codec_type_ = process.codec_type; |
| 487 start_bitrate_ = rate_profile.target_bit_rate[0]; | 437 start_bitrate_ = rate_profile.target_bit_rate[0]; |
| 488 packet_loss_ = process.packet_loss; | 438 packet_loss_ = process.packet_loss; |
| 489 key_frame_interval_ = process.key_frame_interval; | 439 key_frame_interval_ = process.key_frame_interval; |
| 490 num_temporal_layers_ = process.num_temporal_layers; | 440 num_temporal_layers_ = process.num_temporal_layers; |
| 491 error_concealment_on_ = process.error_concealment_on; | 441 error_concealment_on_ = process.error_concealment_on; |
| 492 denoising_on_ = process.denoising_on; | 442 denoising_on_ = process.denoising_on; |
| 493 frame_dropper_on_ = process.frame_dropper_on; | 443 frame_dropper_on_ = process.frame_dropper_on; |
| 494 spatial_resize_on_ = process.spatial_resize_on; | 444 spatial_resize_on_ = process.spatial_resize_on; |
| 495 SetUpCodecConfig(); | 445 SetUpCodecConfig(process.filename, process.width, process.height, |
| 446 process.verbose_logging); | |
| 496 // Update the layers and the codec with the initial rates. | 447 // Update the layers and the codec with the initial rates. |
| 497 bit_rate_ = rate_profile.target_bit_rate[0]; | 448 bit_rate_ = rate_profile.target_bit_rate[0]; |
| 498 frame_rate_ = rate_profile.input_frame_rate[0]; | 449 frame_rate_ = rate_profile.input_frame_rate[0]; |
| 499 SetLayerRates(); | 450 SetLayerRates(); |
| 500 // Set the initial target size for key frame. | 451 // Set the initial target size for key frame. |
| 501 target_size_key_frame_initial_ = | 452 target_size_key_frame_initial_ = |
| 502 0.5 * kInitialBufferSize * bit_rate_layer_[0]; | 453 0.5 * kInitialBufferSize * bit_rate_layer_[0]; |
| 503 processor_->SetRates(bit_rate_, frame_rate_); | 454 processor_->SetRates(bit_rate_, frame_rate_); |
| 504 // Process each frame, up to |num_frames|. | 455 // Process each frame, up to |num_frames|. |
| 505 int num_frames = rate_profile.num_frames; | 456 int num_frames = rate_profile.num_frames; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 572 ssim_result.min); | 523 ssim_result.min); |
| 573 stats_.PrintSummary(); | 524 stats_.PrintSummary(); |
| 574 EXPECT_GT(psnr_result.average, quality_metrics.minimum_avg_psnr); | 525 EXPECT_GT(psnr_result.average, quality_metrics.minimum_avg_psnr); |
| 575 EXPECT_GT(psnr_result.min, quality_metrics.minimum_min_psnr); | 526 EXPECT_GT(psnr_result.min, quality_metrics.minimum_min_psnr); |
| 576 EXPECT_GT(ssim_result.average, quality_metrics.minimum_avg_ssim); | 527 EXPECT_GT(ssim_result.average, quality_metrics.minimum_avg_ssim); |
| 577 EXPECT_GT(ssim_result.min, quality_metrics.minimum_min_ssim); | 528 EXPECT_GT(ssim_result.min, quality_metrics.minimum_min_ssim); |
| 578 if (remove(config_.output_filename.c_str()) < 0) { | 529 if (remove(config_.output_filename.c_str()) < 0) { |
| 579 fprintf(stderr, "Failed to remove temporary file!\n"); | 530 fprintf(stderr, "Failed to remove temporary file!\n"); |
| 580 } | 531 } |
| 581 } | 532 } |
| 533 | |
| 534 void SetRateProfilePars(RateProfile* rate_profile, | |
|
brandtr
2017/02/09 13:32:43
Make all these member functions static, to show th
åsapersson
2017/02/09 16:39:37
Done.
| |
| 535 int update_index, | |
| 536 int bit_rate, | |
| 537 int frame_rate, | |
| 538 int frame_index_rate_update) { | |
| 539 rate_profile->target_bit_rate[update_index] = bit_rate; | |
| 540 rate_profile->input_frame_rate[update_index] = frame_rate; | |
| 541 rate_profile->frame_index_rate_update[update_index] = | |
| 542 frame_index_rate_update; | |
| 543 } | |
| 544 | |
| 545 void SetCodecParameters(CodecConfigPars* process_settings, | |
| 546 VideoCodecType codec_type, | |
| 547 float packet_loss, | |
| 548 int key_frame_interval, | |
| 549 int num_temporal_layers, | |
| 550 bool error_concealment_on, | |
| 551 bool denoising_on, | |
| 552 bool frame_dropper_on, | |
| 553 bool spatial_resize_on, | |
| 554 int width, | |
| 555 int height, | |
| 556 const std::string& filename, | |
| 557 bool verbose_logging) { | |
| 558 process_settings->codec_type = codec_type; | |
| 559 process_settings->packet_loss = packet_loss; | |
| 560 process_settings->key_frame_interval = key_frame_interval; | |
| 561 process_settings->num_temporal_layers = num_temporal_layers, | |
| 562 process_settings->error_concealment_on = error_concealment_on; | |
| 563 process_settings->denoising_on = denoising_on; | |
| 564 process_settings->frame_dropper_on = frame_dropper_on; | |
| 565 process_settings->spatial_resize_on = spatial_resize_on; | |
| 566 process_settings->width = width; | |
| 567 process_settings->height = height; | |
| 568 process_settings->filename = filename; | |
| 569 process_settings->verbose_logging = verbose_logging; | |
| 570 } | |
| 571 | |
| 572 void SetCodecParameters(CodecConfigPars* process_settings, | |
| 573 VideoCodecType codec_type, | |
| 574 float packet_loss, | |
| 575 int key_frame_interval, | |
| 576 int num_temporal_layers, | |
| 577 bool error_concealment_on, | |
| 578 bool denoising_on, | |
| 579 bool frame_dropper_on, | |
| 580 bool spatial_resize_on) { | |
| 581 SetCodecParameters(process_settings, codec_type, packet_loss, | |
| 582 key_frame_interval, num_temporal_layers, | |
| 583 error_concealment_on, denoising_on, frame_dropper_on, | |
| 584 spatial_resize_on, kCifWidth, kCifHeight, | |
| 585 kFilenameForemanCif, false /* verbose_logging */); | |
| 586 } | |
| 587 | |
| 588 void SetQualityMetrics(QualityMetrics* quality_metrics, | |
| 589 double minimum_avg_psnr, | |
| 590 double minimum_min_psnr, | |
| 591 double minimum_avg_ssim, | |
| 592 double minimum_min_ssim) { | |
| 593 quality_metrics->minimum_avg_psnr = minimum_avg_psnr; | |
| 594 quality_metrics->minimum_min_psnr = minimum_min_psnr; | |
| 595 quality_metrics->minimum_avg_ssim = minimum_avg_ssim; | |
| 596 quality_metrics->minimum_min_ssim = minimum_min_ssim; | |
| 597 } | |
| 598 | |
| 599 void SetRateControlMetrics(RateControlMetrics* rc_metrics, | |
| 600 int update_index, | |
| 601 int max_num_dropped_frames, | |
| 602 int max_key_frame_size_mismatch, | |
| 603 int max_delta_frame_size_mismatch, | |
| 604 int max_encoding_rate_mismatch, | |
| 605 int max_time_hit_target, | |
| 606 int num_spatial_resizes, | |
| 607 int num_key_frames) { | |
| 608 rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames; | |
| 609 rc_metrics[update_index].max_key_frame_size_mismatch = | |
| 610 max_key_frame_size_mismatch; | |
| 611 rc_metrics[update_index].max_delta_frame_size_mismatch = | |
| 612 max_delta_frame_size_mismatch; | |
| 613 rc_metrics[update_index].max_encoding_rate_mismatch = | |
| 614 max_encoding_rate_mismatch; | |
| 615 rc_metrics[update_index].max_time_hit_target = max_time_hit_target; | |
| 616 rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes; | |
| 617 rc_metrics[update_index].num_key_frames = num_key_frames; | |
| 618 } | |
| 582 }; | 619 }; |
| 583 | 620 |
| 584 #if defined(WEBRTC_VIDEOPROCESSOR_H264_TESTS) | 621 } // namespace test |
| 622 } // namespace webrtc | |
| 585 | 623 |
| 586 // H264: Run with no packet loss and fixed bitrate. Quality should be very high. | 624 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTES T_H_ |
| 587 // Note(hbos): The PacketManipulatorImpl code used to simulate packet loss in | |
| 588 // these unittests appears to drop "packets" in a way that is not compatible | |
| 589 // with H264. Therefore ProcessXPercentPacketLossH264, X != 0, unittests have | |
| 590 // not been added. | |
| 591 TEST_F(VideoProcessorIntegrationTest, Process0PercentPacketLossH264) { | |
| 592 // Bitrate and frame rate profile. | |
| 593 RateProfile rate_profile; | |
| 594 SetRateProfilePars(&rate_profile, 0, 500, 30, 0); | |
| 595 rate_profile.frame_index_rate_update[1] = kNbrFramesShort + 1; | |
| 596 rate_profile.num_frames = kNbrFramesShort; | |
| 597 // Codec/network settings. | |
| 598 CodecConfigPars process_settings; | |
| 599 SetCodecParameters(&process_settings, kVideoCodecH264, 0.0f, -1, 1, false, | |
| 600 false, true, false); | |
| 601 // Metrics for expected quality. | |
| 602 QualityMetrics quality_metrics; | |
| 603 SetQualityMetrics(&quality_metrics, 35.0, 25.0, 0.93, 0.70); | |
| 604 // Metrics for rate control. | |
| 605 RateControlMetrics rc_metrics[1]; | |
| 606 SetRateControlMetrics(rc_metrics, 0, 2, 60, 20, 10, 20, 0, 1); | |
| 607 ProcessFramesAndVerify(quality_metrics, | |
| 608 rate_profile, | |
| 609 process_settings, | |
| 610 rc_metrics); | |
| 611 } | |
| 612 | |
| 613 #endif // defined(WEBRTC_VIDEOPROCESSOR_H264_TESTS) | |
| 614 | |
| 615 // Fails on iOS. See webrtc:4755. | |
| 616 #if !defined(WEBRTC_IOS) | |
| 617 | |
| 618 #if !defined(RTC_DISABLE_VP9) | |
| 619 // VP9: Run with no packet loss and fixed bitrate. Quality should be very high. | |
| 620 // One key frame (first frame only) in sequence. Setting |key_frame_interval| | |
| 621 // to -1 below means no periodic key frames in test. | |
| 622 TEST_F(VideoProcessorIntegrationTest, Process0PercentPacketLossVP9) { | |
| 623 // Bitrate and frame rate profile. | |
| 624 RateProfile rate_profile; | |
| 625 SetRateProfilePars(&rate_profile, 0, 500, 30, 0); | |
| 626 rate_profile.frame_index_rate_update[1] = kNbrFramesShort + 1; | |
| 627 rate_profile.num_frames = kNbrFramesShort; | |
| 628 // Codec/network settings. | |
| 629 CodecConfigPars process_settings; | |
| 630 SetCodecParameters(&process_settings, kVideoCodecVP9, 0.0f, -1, 1, false, | |
| 631 false, true, false); | |
| 632 // Metrics for expected quality. | |
| 633 QualityMetrics quality_metrics; | |
| 634 SetQualityMetrics(&quality_metrics, 37.0, 36.0, 0.93, 0.92); | |
| 635 // Metrics for rate control. | |
| 636 RateControlMetrics rc_metrics[1]; | |
| 637 SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0, 1); | |
| 638 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 639 rc_metrics); | |
| 640 } | |
| 641 | |
| 642 // VP9: Run with 5% packet loss and fixed bitrate. Quality should be a bit | |
| 643 // lower. One key frame (first frame only) in sequence. | |
| 644 TEST_F(VideoProcessorIntegrationTest, Process5PercentPacketLossVP9) { | |
| 645 // Bitrate and frame rate profile. | |
| 646 RateProfile rate_profile; | |
| 647 SetRateProfilePars(&rate_profile, 0, 500, 30, 0); | |
| 648 rate_profile.frame_index_rate_update[1] = kNbrFramesShort + 1; | |
| 649 rate_profile.num_frames = kNbrFramesShort; | |
| 650 // Codec/network settings. | |
| 651 CodecConfigPars process_settings; | |
| 652 SetCodecParameters(&process_settings, kVideoCodecVP9, 0.05f, -1, 1, false, | |
| 653 false, true, false); | |
| 654 // Metrics for expected quality. | |
| 655 QualityMetrics quality_metrics; | |
| 656 SetQualityMetrics(&quality_metrics, 17.0, 14.0, 0.45, 0.36); | |
| 657 // Metrics for rate control. | |
| 658 RateControlMetrics rc_metrics[1]; | |
| 659 SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0, 1); | |
| 660 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 661 rc_metrics); | |
| 662 } | |
| 663 | |
| 664 // VP9: Run with no packet loss, with varying bitrate (3 rate updates): | |
| 665 // low to high to medium. Check that quality and encoder response to the new | |
| 666 // target rate/per-frame bandwidth (for each rate update) is within limits. | |
| 667 // One key frame (first frame only) in sequence. | |
| 668 TEST_F(VideoProcessorIntegrationTest, ProcessNoLossChangeBitRateVP9) { | |
| 669 // Bitrate and frame rate profile. | |
| 670 RateProfile rate_profile; | |
| 671 SetRateProfilePars(&rate_profile, 0, 200, 30, 0); | |
| 672 SetRateProfilePars(&rate_profile, 1, 700, 30, 100); | |
| 673 SetRateProfilePars(&rate_profile, 2, 500, 30, 200); | |
| 674 rate_profile.frame_index_rate_update[3] = kNbrFramesLong + 1; | |
| 675 rate_profile.num_frames = kNbrFramesLong; | |
| 676 // Codec/network settings. | |
| 677 CodecConfigPars process_settings; | |
| 678 SetCodecParameters(&process_settings, kVideoCodecVP9, 0.0f, -1, 1, false, | |
| 679 false, true, false); | |
| 680 // Metrics for expected quality. | |
| 681 QualityMetrics quality_metrics; | |
| 682 SetQualityMetrics(&quality_metrics, 35.5, 30.0, 0.90, 0.85); | |
| 683 // Metrics for rate control. | |
| 684 RateControlMetrics rc_metrics[3]; | |
| 685 SetRateControlMetrics(rc_metrics, 0, 0, 30, 20, 20, 30, 0, 1); | |
| 686 SetRateControlMetrics(rc_metrics, 1, 2, 0, 20, 20, 60, 0, 0); | |
| 687 SetRateControlMetrics(rc_metrics, 2, 0, 0, 25, 20, 40, 0, 0); | |
| 688 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 689 rc_metrics); | |
| 690 } | |
| 691 | |
| 692 // VP9: Run with no packet loss, with an update (decrease) in frame rate. | |
| 693 // Lower frame rate means higher per-frame-bandwidth, so easier to encode. | |
| 694 // At the low bitrate in this test, this means better rate control after the | |
| 695 // update(s) to lower frame rate. So expect less frame drops, and max values | |
| 696 // for the rate control metrics can be lower. One key frame (first frame only). | |
| 697 // Note: quality after update should be higher but we currently compute quality | |
| 698 // metrics averaged over whole sequence run. | |
| 699 TEST_F(VideoProcessorIntegrationTest, | |
| 700 ProcessNoLossChangeFrameRateFrameDropVP9) { | |
| 701 config_.networking_config.packet_loss_probability = 0; | |
| 702 // Bitrate and frame rate profile. | |
| 703 RateProfile rate_profile; | |
| 704 SetRateProfilePars(&rate_profile, 0, 100, 24, 0); | |
| 705 SetRateProfilePars(&rate_profile, 1, 100, 15, 100); | |
| 706 SetRateProfilePars(&rate_profile, 2, 100, 10, 200); | |
| 707 rate_profile.frame_index_rate_update[3] = kNbrFramesLong + 1; | |
| 708 rate_profile.num_frames = kNbrFramesLong; | |
| 709 // Codec/network settings. | |
| 710 CodecConfigPars process_settings; | |
| 711 SetCodecParameters(&process_settings, kVideoCodecVP9, 0.0f, -1, 1, false, | |
| 712 false, true, false); | |
| 713 // Metrics for expected quality. | |
| 714 QualityMetrics quality_metrics; | |
| 715 SetQualityMetrics(&quality_metrics, 31.5, 18.0, 0.80, 0.43); | |
| 716 // Metrics for rate control. | |
| 717 RateControlMetrics rc_metrics[3]; | |
| 718 SetRateControlMetrics(rc_metrics, 0, 38, 50, 75, 15, 45, 0, 1); | |
| 719 SetRateControlMetrics(rc_metrics, 1, 10, 0, 40, 10, 30, 0, 0); | |
| 720 SetRateControlMetrics(rc_metrics, 2, 5, 0, 30, 5, 20, 0, 0); | |
| 721 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 722 rc_metrics); | |
| 723 } | |
| 724 | |
| 725 // VP9: Run with no packet loss and denoiser on. One key frame (first frame). | |
| 726 TEST_F(VideoProcessorIntegrationTest, ProcessNoLossDenoiserOnVP9) { | |
| 727 // Bitrate and frame rate profile. | |
| 728 RateProfile rate_profile; | |
| 729 SetRateProfilePars(&rate_profile, 0, 500, 30, 0); | |
| 730 rate_profile.frame_index_rate_update[1] = kNbrFramesShort + 1; | |
| 731 rate_profile.num_frames = kNbrFramesShort; | |
| 732 // Codec/network settings. | |
| 733 CodecConfigPars process_settings; | |
| 734 SetCodecParameters(&process_settings, kVideoCodecVP9, 0.0f, -1, 1, false, | |
| 735 true, true, false); | |
| 736 // Metrics for expected quality. | |
| 737 QualityMetrics quality_metrics; | |
| 738 SetQualityMetrics(&quality_metrics, 36.8, 35.8, 0.92, 0.91); | |
| 739 // Metrics for rate control. | |
| 740 RateControlMetrics rc_metrics[1]; | |
| 741 SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 20, 0, 1); | |
| 742 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 743 rc_metrics); | |
| 744 } | |
| 745 | |
| 746 // Run with no packet loss, at low bitrate. | |
| 747 // spatial_resize is on, for this low bitrate expect one resize in sequence. | |
| 748 // Resize happens on delta frame. Expect only one key frame (first frame). | |
| 749 TEST_F(VideoProcessorIntegrationTest, | |
| 750 DISABLED_ProcessNoLossSpatialResizeFrameDropVP9) { | |
| 751 config_.networking_config.packet_loss_probability = 0; | |
| 752 // Bitrate and frame rate profile. | |
| 753 RateProfile rate_profile; | |
| 754 SetRateProfilePars(&rate_profile, 0, 50, 30, 0); | |
| 755 rate_profile.frame_index_rate_update[1] = kNbrFramesLong + 1; | |
| 756 rate_profile.num_frames = kNbrFramesLong; | |
| 757 // Codec/network settings. | |
| 758 CodecConfigPars process_settings; | |
| 759 SetCodecParameters(&process_settings, kVideoCodecVP9, 0.0f, -1, 1, false, | |
| 760 false, true, true); | |
| 761 // Metrics for expected quality. | |
| 762 QualityMetrics quality_metrics; | |
| 763 SetQualityMetrics(&quality_metrics, 24.0, 13.0, 0.65, 0.37); | |
| 764 // Metrics for rate control. | |
| 765 RateControlMetrics rc_metrics[1]; | |
| 766 SetRateControlMetrics(rc_metrics, 0, 228, 70, 160, 15, 80, 1, 1); | |
| 767 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 768 rc_metrics); | |
| 769 } | |
| 770 | |
| 771 // TODO(marpan): Add temporal layer test for VP9, once changes are in | |
| 772 // vp9 wrapper for this. | |
| 773 | |
| 774 #endif // !defined(RTC_DISABLE_VP9) | |
| 775 | |
| 776 // VP8: Run with no packet loss and fixed bitrate. Quality should be very high. | |
| 777 // One key frame (first frame only) in sequence. Setting |key_frame_interval| | |
| 778 // to -1 below means no periodic key frames in test. | |
| 779 TEST_F(VideoProcessorIntegrationTest, ProcessZeroPacketLoss) { | |
| 780 // Bitrate and frame rate profile. | |
| 781 RateProfile rate_profile; | |
| 782 SetRateProfilePars(&rate_profile, 0, 500, 30, 0); | |
| 783 rate_profile.frame_index_rate_update[1] = kNbrFramesShort + 1; | |
| 784 rate_profile.num_frames = kNbrFramesShort; | |
| 785 // Codec/network settings. | |
| 786 CodecConfigPars process_settings; | |
| 787 SetCodecParameters(&process_settings, kVideoCodecVP8, 0.0f, -1, 1, false, | |
| 788 true, true, false); | |
| 789 // Metrics for expected quality. | |
| 790 QualityMetrics quality_metrics; | |
| 791 SetQualityMetrics(&quality_metrics, 34.95, 33.0, 0.90, 0.89); | |
| 792 // Metrics for rate control. | |
| 793 RateControlMetrics rc_metrics[1]; | |
| 794 SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0, 1); | |
| 795 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 796 rc_metrics); | |
| 797 } | |
| 798 | |
| 799 // VP8: Run with 5% packet loss and fixed bitrate. Quality should be a bit | |
| 800 // lower. One key frame (first frame only) in sequence. | |
| 801 TEST_F(VideoProcessorIntegrationTest, Process5PercentPacketLoss) { | |
| 802 // Bitrate and frame rate profile. | |
| 803 RateProfile rate_profile; | |
| 804 SetRateProfilePars(&rate_profile, 0, 500, 30, 0); | |
| 805 rate_profile.frame_index_rate_update[1] = kNbrFramesShort + 1; | |
| 806 rate_profile.num_frames = kNbrFramesShort; | |
| 807 // Codec/network settings. | |
| 808 CodecConfigPars process_settings; | |
| 809 SetCodecParameters(&process_settings, kVideoCodecVP8, 0.05f, -1, 1, false, | |
| 810 true, true, false); | |
| 811 // Metrics for expected quality. | |
| 812 QualityMetrics quality_metrics; | |
| 813 SetQualityMetrics(&quality_metrics, 20.0, 16.0, 0.60, 0.40); | |
| 814 // Metrics for rate control. | |
| 815 RateControlMetrics rc_metrics[1]; | |
| 816 SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0, 1); | |
| 817 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 818 rc_metrics); | |
| 819 } | |
| 820 | |
| 821 // VP8: Run with 10% packet loss and fixed bitrate. Quality should be lower. | |
| 822 // One key frame (first frame only) in sequence. | |
| 823 TEST_F(VideoProcessorIntegrationTest, Process10PercentPacketLoss) { | |
| 824 // Bitrate and frame rate profile. | |
| 825 RateProfile rate_profile; | |
| 826 SetRateProfilePars(&rate_profile, 0, 500, 30, 0); | |
| 827 rate_profile.frame_index_rate_update[1] = kNbrFramesShort + 1; | |
| 828 rate_profile.num_frames = kNbrFramesShort; | |
| 829 // Codec/network settings. | |
| 830 CodecConfigPars process_settings; | |
| 831 SetCodecParameters(&process_settings, kVideoCodecVP8, 0.1f, -1, 1, false, | |
| 832 true, true, false); | |
| 833 // Metrics for expected quality. | |
| 834 QualityMetrics quality_metrics; | |
| 835 SetQualityMetrics(&quality_metrics, 19.0, 16.0, 0.50, 0.35); | |
| 836 // Metrics for rate control. | |
| 837 RateControlMetrics rc_metrics[1]; | |
| 838 SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0, 1); | |
| 839 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 840 rc_metrics); | |
| 841 } | |
| 842 | |
| 843 #endif // !defined(WEBRTC_IOS) | |
| 844 | |
| 845 // The tests below are currently disabled for Android. For ARM, the encoder | |
| 846 // uses |cpu_speed| = 12, as opposed to default |cpu_speed| <= 6 for x86, | |
| 847 // which leads to significantly different quality. The quality and rate control | |
| 848 // settings in the tests below are defined for encoder speed setting | |
| 849 // |cpu_speed| <= ~6. A number of settings would need to be significantly | |
| 850 // modified for the |cpu_speed| = 12 case. For now, keep the tests below | |
| 851 // disabled on Android. Some quality parameter in the above test has been | |
| 852 // adjusted to also pass for |cpu_speed| <= 12. | |
| 853 | |
| 854 // VP8: Run with no packet loss, with varying bitrate (3 rate updates): | |
| 855 // low to high to medium. Check that quality and encoder response to the new | |
| 856 // target rate/per-frame bandwidth (for each rate update) is within limits. | |
| 857 // One key frame (first frame only) in sequence. | |
| 858 // Too slow to finish before timeout on iOS. See webrtc:4755. | |
| 859 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) | |
| 860 #define MAYBE_ProcessNoLossChangeBitRateVP8 \ | |
| 861 DISABLED_ProcessNoLossChangeBitRateVP8 | |
| 862 #else | |
| 863 #define MAYBE_ProcessNoLossChangeBitRateVP8 ProcessNoLossChangeBitRateVP8 | |
| 864 #endif | |
| 865 TEST_F(VideoProcessorIntegrationTest, MAYBE_ProcessNoLossChangeBitRateVP8) { | |
| 866 // Bitrate and frame rate profile. | |
| 867 RateProfile rate_profile; | |
| 868 SetRateProfilePars(&rate_profile, 0, 200, 30, 0); | |
| 869 SetRateProfilePars(&rate_profile, 1, 800, 30, 100); | |
| 870 SetRateProfilePars(&rate_profile, 2, 500, 30, 200); | |
| 871 rate_profile.frame_index_rate_update[3] = kNbrFramesLong + 1; | |
| 872 rate_profile.num_frames = kNbrFramesLong; | |
| 873 // Codec/network settings. | |
| 874 CodecConfigPars process_settings; | |
| 875 SetCodecParameters(&process_settings, kVideoCodecVP8, 0.0f, -1, 1, false, | |
| 876 true, true, false); | |
| 877 // Metrics for expected quality. | |
| 878 QualityMetrics quality_metrics; | |
| 879 SetQualityMetrics(&quality_metrics, 34.0, 32.0, 0.85, 0.80); | |
| 880 // Metrics for rate control. | |
| 881 RateControlMetrics rc_metrics[3]; | |
| 882 SetRateControlMetrics(rc_metrics, 0, 0, 45, 20, 10, 15, 0, 1); | |
| 883 SetRateControlMetrics(rc_metrics, 1, 0, 0, 25, 20, 10, 0, 0); | |
| 884 SetRateControlMetrics(rc_metrics, 2, 0, 0, 25, 15, 10, 0, 0); | |
| 885 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 886 rc_metrics); | |
| 887 } | |
| 888 | |
| 889 // VP8: Run with no packet loss, with an update (decrease) in frame rate. | |
| 890 // Lower frame rate means higher per-frame-bandwidth, so easier to encode. | |
| 891 // At the bitrate in this test, this means better rate control after the | |
| 892 // update(s) to lower frame rate. So expect less frame drops, and max values | |
| 893 // for the rate control metrics can be lower. One key frame (first frame only). | |
| 894 // Note: quality after update should be higher but we currently compute quality | |
| 895 // metrics averaged over whole sequence run. | |
| 896 // Too slow to finish before timeout on iOS. See webrtc:4755. | |
| 897 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) | |
| 898 #define MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8 \ | |
| 899 DISABLED_ProcessNoLossChangeFrameRateFrameDropVP8 | |
| 900 #else | |
| 901 #define MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8 \ | |
| 902 ProcessNoLossChangeFrameRateFrameDropVP8 | |
| 903 #endif | |
| 904 TEST_F(VideoProcessorIntegrationTest, | |
| 905 MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8) { | |
| 906 config_.networking_config.packet_loss_probability = 0; | |
| 907 // Bitrate and frame rate profile. | |
| 908 RateProfile rate_profile; | |
| 909 SetRateProfilePars(&rate_profile, 0, 80, 24, 0); | |
| 910 SetRateProfilePars(&rate_profile, 1, 80, 15, 100); | |
| 911 SetRateProfilePars(&rate_profile, 2, 80, 10, 200); | |
| 912 rate_profile.frame_index_rate_update[3] = kNbrFramesLong + 1; | |
| 913 rate_profile.num_frames = kNbrFramesLong; | |
| 914 // Codec/network settings. | |
| 915 CodecConfigPars process_settings; | |
| 916 SetCodecParameters(&process_settings, kVideoCodecVP8, 0.0f, -1, 1, false, | |
| 917 true, true, false); | |
| 918 // Metrics for expected quality. | |
| 919 QualityMetrics quality_metrics; | |
| 920 SetQualityMetrics(&quality_metrics, 31.0, 22.0, 0.80, 0.65); | |
| 921 // Metrics for rate control. | |
| 922 RateControlMetrics rc_metrics[3]; | |
| 923 SetRateControlMetrics(rc_metrics, 0, 40, 20, 75, 15, 60, 0, 1); | |
| 924 SetRateControlMetrics(rc_metrics, 1, 10, 0, 25, 10, 35, 0, 0); | |
| 925 SetRateControlMetrics(rc_metrics, 2, 0, 0, 20, 10, 15, 0, 0); | |
| 926 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 927 rc_metrics); | |
| 928 } | |
| 929 | |
| 930 // VP8: Run with no packet loss, with 3 temporal layers, with a rate update in | |
| 931 // the middle of the sequence. The max values for the frame size mismatch and | |
| 932 // encoding rate mismatch are applied to each layer. | |
| 933 // No dropped frames in this test, and internal spatial resizer is off. | |
| 934 // One key frame (first frame only) in sequence, so no spatial resizing. | |
| 935 // Too slow to finish before timeout on iOS. See webrtc:4755. | |
| 936 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) | |
| 937 #define MAYBE_ProcessNoLossTemporalLayersVP8 \ | |
| 938 DISABLED_ProcessNoLossTemporalLayersVP8 | |
| 939 #else | |
| 940 #define MAYBE_ProcessNoLossTemporalLayersVP8 ProcessNoLossTemporalLayersVP8 | |
| 941 #endif | |
| 942 TEST_F(VideoProcessorIntegrationTest, MAYBE_ProcessNoLossTemporalLayersVP8) { | |
| 943 config_.networking_config.packet_loss_probability = 0; | |
| 944 // Bitrate and frame rate profile. | |
| 945 RateProfile rate_profile; | |
| 946 SetRateProfilePars(&rate_profile, 0, 200, 30, 0); | |
| 947 SetRateProfilePars(&rate_profile, 1, 400, 30, 150); | |
| 948 rate_profile.frame_index_rate_update[2] = kNbrFramesLong + 1; | |
| 949 rate_profile.num_frames = kNbrFramesLong; | |
| 950 // Codec/network settings. | |
| 951 CodecConfigPars process_settings; | |
| 952 SetCodecParameters(&process_settings, kVideoCodecVP8, 0.0f, -1, 3, false, | |
| 953 true, true, false); | |
| 954 // Metrics for expected quality. | |
| 955 QualityMetrics quality_metrics; | |
| 956 SetQualityMetrics(&quality_metrics, 32.5, 30.0, 0.85, 0.80); | |
| 957 // Metrics for rate control. | |
| 958 RateControlMetrics rc_metrics[2]; | |
| 959 SetRateControlMetrics(rc_metrics, 0, 0, 20, 30, 10, 10, 0, 1); | |
| 960 SetRateControlMetrics(rc_metrics, 1, 0, 0, 30, 15, 10, 0, 0); | |
| 961 ProcessFramesAndVerify(quality_metrics, rate_profile, process_settings, | |
| 962 rc_metrics); | |
| 963 } | |
| 964 } // namespace webrtc | |
| OLD | NEW |