Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h

Issue 2706123003: Reland of Add optional visualization file writers to VideoProcessor tests. (Closed)
Patch Set: Rebase fixes. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <memory> 16 #include <memory>
17 #include <string> 17 #include <string>
18 #include <utility>
18 19
19 #if defined(WEBRTC_ANDROID) 20 #if defined(WEBRTC_ANDROID)
20 #include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h" 21 #include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h"
21 #include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h" 22 #include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h"
22 #include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h" 23 #include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h"
23 #elif defined(WEBRTC_IOS) 24 #elif defined(WEBRTC_IOS)
24 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h" 25 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h"
25 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h" 26 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h"
26 #endif 27 #endif
27 28
28 #include "webrtc/base/checks.h" 29 #include "webrtc/base/checks.h"
30 #include "webrtc/base/file.h"
29 #include "webrtc/media/engine/webrtcvideodecoderfactory.h" 31 #include "webrtc/media/engine/webrtcvideodecoderfactory.h"
30 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" 32 #include "webrtc/media/engine/webrtcvideoencoderfactory.h"
31 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" 33 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
32 #include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h" 34 #include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h"
33 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h" 35 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h"
34 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 36 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
35 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" 37 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
36 #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
37 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 38 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
38 #include "webrtc/modules/video_coding/include/video_codec_interface.h" 39 #include "webrtc/modules/video_coding/include/video_codec_interface.h"
39 #include "webrtc/modules/video_coding/include/video_coding.h" 40 #include "webrtc/modules/video_coding/include/video_coding.h"
41 #include "webrtc/modules/video_coding/utility/ivf_file_writer.h"
40 #include "webrtc/test/gtest.h" 42 #include "webrtc/test/gtest.h"
41 #include "webrtc/test/testsupport/fileutils.h" 43 #include "webrtc/test/testsupport/fileutils.h"
42 #include "webrtc/test/testsupport/frame_reader.h" 44 #include "webrtc/test/testsupport/frame_reader.h"
43 #include "webrtc/test/testsupport/frame_writer.h" 45 #include "webrtc/test/testsupport/frame_writer.h"
44 #include "webrtc/test/testsupport/metrics/video_metrics.h" 46 #include "webrtc/test/testsupport/metrics/video_metrics.h"
45 #include "webrtc/test/testsupport/packet_reader.h" 47 #include "webrtc/test/testsupport/packet_reader.h"
46 #include "webrtc/typedefs.h" 48 #include "webrtc/typedefs.h"
47 49
48 namespace webrtc { 50 namespace webrtc {
49 namespace test { 51 namespace test {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 struct RateControlMetrics { 105 struct RateControlMetrics {
104 int max_num_dropped_frames; 106 int max_num_dropped_frames;
105 int max_key_frame_size_mismatch; 107 int max_key_frame_size_mismatch;
106 int max_delta_frame_size_mismatch; 108 int max_delta_frame_size_mismatch;
107 int max_encoding_rate_mismatch; 109 int max_encoding_rate_mismatch;
108 int max_time_hit_target; 110 int max_time_hit_target;
109 int num_spatial_resizes; 111 int num_spatial_resizes;
110 int num_key_frames; 112 int num_key_frames;
111 }; 113 };
112 114
115 // Should video files be saved persistently to disk for post-run visualization?
116 struct VisualizationParams {
117 bool save_source_y4m;
118 bool save_encoded_ivf;
119 bool save_decoded_y4m;
120 };
121
113 #if !defined(WEBRTC_IOS) 122 #if !defined(WEBRTC_IOS)
114 const int kNumFramesShort = 100; 123 const int kNumFramesShort = 100;
115 #endif 124 #endif
116 const int kNumFramesLong = 299; 125 const int kNumFramesLong = 299;
117 126
118 // Parameters from VP8 wrapper, which control target size of key frames. 127 // Parameters from VP8 wrapper, which control target size of key frames.
119 const float kInitialBufferSize = 0.5f; 128 const float kInitialBufferSize = 0.5f;
120 const float kOptimalBufferSize = 0.6f; 129 const float kOptimalBufferSize = 0.6f;
121 const float kScaleKeyFrameSize = 0.5f; 130 const float kScaleKeyFrameSize = 0.5f;
122 131
(...skipping 13 matching lines...) Expand all
136 InitializeAndroidObjects(); 145 InitializeAndroidObjects();
137 146
138 external_encoder_factory_.reset( 147 external_encoder_factory_.reset(
139 new webrtc_jni::MediaCodecVideoEncoderFactory()); 148 new webrtc_jni::MediaCodecVideoEncoderFactory());
140 external_decoder_factory_.reset( 149 external_decoder_factory_.reset(
141 new webrtc_jni::MediaCodecVideoDecoderFactory()); 150 new webrtc_jni::MediaCodecVideoDecoderFactory());
142 #endif 151 #endif
143 } 152 }
144 virtual ~VideoProcessorIntegrationTest() = default; 153 virtual ~VideoProcessorIntegrationTest() = default;
145 154
146 void SetUpCodecConfig(const CodecConfigPars& process) { 155 void SetUpCodecConfig(const CodecConfigPars& process,
156 const VisualizationParams* visualization_params) {
147 if (process.hw_codec) { 157 if (process.hw_codec) {
148 #if defined(WEBRTC_VIDEOPROCESSOR_INTEGRATIONTEST_HW_CODECS_ENABLED) 158 #if defined(WEBRTC_VIDEOPROCESSOR_INTEGRATIONTEST_HW_CODECS_ENABLED)
149 #if defined(WEBRTC_ANDROID) 159 #if defined(WEBRTC_ANDROID)
150 // In general, external codecs should be destroyed by the factories that 160 // In general, external codecs should be destroyed by the factories that
151 // allocated them. For the particular case of the Android 161 // allocated them. For the particular case of the Android
152 // MediaCodecVideo{En,De}coderFactory's, however, it turns out that it is 162 // MediaCodecVideo{En,De}coderFactory's, however, it turns out that it is
153 // fine for the std::unique_ptr to destroy the owned codec directly. 163 // fine for the std::unique_ptr to destroy the owned codec directly.
154 switch (process.codec_type) { 164 switch (process.codec_type) {
155 case kVideoCodecH264: 165 case kVideoCodecH264:
156 encoder_.reset(external_encoder_factory_->CreateVideoEncoder( 166 encoder_.reset(external_encoder_factory_->CreateVideoEncoder(
(...skipping 11 matching lines...) Expand all
168 encoder_.reset(external_encoder_factory_->CreateVideoEncoder( 178 encoder_.reset(external_encoder_factory_->CreateVideoEncoder(
169 cricket::VideoCodec(cricket::kVp9CodecName))); 179 cricket::VideoCodec(cricket::kVp9CodecName)));
170 decoder_.reset( 180 decoder_.reset(
171 external_decoder_factory_->CreateVideoDecoder(kVideoCodecVP9)); 181 external_decoder_factory_->CreateVideoDecoder(kVideoCodecVP9));
172 break; 182 break;
173 default: 183 default:
174 RTC_NOTREACHED(); 184 RTC_NOTREACHED();
175 break; 185 break;
176 } 186 }
177 #elif defined(WEBRTC_IOS) 187 #elif defined(WEBRTC_IOS)
178 RTC_DCHECK_EQ(kVideoCodecH264, process.codec_type) 188 ASSERT_EQ(kVideoCodecH264, process.codec_type)
179 << "iOS HW codecs only support H264."; 189 << "iOS HW codecs only support H264.";
180 encoder_.reset(new H264VideoToolboxEncoder( 190 encoder_.reset(new H264VideoToolboxEncoder(
181 cricket::VideoCodec(cricket::kH264CodecName))); 191 cricket::VideoCodec(cricket::kH264CodecName)));
182 decoder_.reset(new H264VideoToolboxDecoder()); 192 decoder_.reset(new H264VideoToolboxDecoder());
183 #else 193 #else
184 RTC_NOTREACHED() << "Only support HW codecs on Android and iOS."; 194 RTC_NOTREACHED() << "Only support HW codecs on Android and iOS.";
185 #endif 195 #endif
186 #endif // WEBRTC_VIDEOPROCESSOR_INTEGRATIONTEST_HW_CODECS_ENABLED 196 #endif // WEBRTC_VIDEOPROCESSOR_INTEGRATIONTEST_HW_CODECS_ENABLED
187 RTC_DCHECK(encoder_) << "HW encoder not successfully created."; 197 RTC_CHECK(encoder_) << "HW encoder not successfully created.";
188 RTC_DCHECK(decoder_) << "HW decoder not successfully created."; 198 RTC_CHECK(decoder_) << "HW decoder not successfully created.";
189 } else { 199 } else {
190 // SW codecs. 200 // SW codecs.
191 switch (process.codec_type) { 201 switch (process.codec_type) {
192 case kVideoCodecH264: 202 case kVideoCodecH264:
193 encoder_.reset(H264Encoder::Create( 203 encoder_.reset(H264Encoder::Create(
194 cricket::VideoCodec(cricket::kH264CodecName))); 204 cricket::VideoCodec(cricket::kH264CodecName)));
195 decoder_.reset(H264Decoder::Create()); 205 decoder_.reset(H264Decoder::Create());
196 break; 206 break;
197 case kVideoCodecVP8: 207 case kVideoCodecVP8:
198 encoder_.reset(VP8Encoder::Create()); 208 encoder_.reset(VP8Encoder::Create());
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 config_.codec_settings->VP9()->frameDroppingOn = 268 config_.codec_settings->VP9()->frameDroppingOn =
259 process.frame_dropper_on; 269 process.frame_dropper_on;
260 config_.codec_settings->VP9()->automaticResizeOn = 270 config_.codec_settings->VP9()->automaticResizeOn =
261 process.spatial_resize_on; 271 process.spatial_resize_on;
262 config_.codec_settings->VP9()->keyFrameInterval = kBaseKeyFrameInterval; 272 config_.codec_settings->VP9()->keyFrameInterval = kBaseKeyFrameInterval;
263 break; 273 break;
264 default: 274 default:
265 RTC_NOTREACHED(); 275 RTC_NOTREACHED();
266 break; 276 break;
267 } 277 }
268 frame_reader_.reset(new test::FrameReaderImpl( 278
279 // Create file objects for quality analysis.
280 analysis_frame_reader_.reset(new test::YuvFrameReaderImpl(
269 config_.input_filename, config_.codec_settings->width, 281 config_.input_filename, config_.codec_settings->width,
270 config_.codec_settings->height)); 282 config_.codec_settings->height));
271 frame_writer_.reset(new test::FrameWriterImpl( 283 analysis_frame_writer_.reset(new test::YuvFrameWriterImpl(
272 config_.output_filename, config_.frame_length_in_bytes)); 284 config_.output_filename, config_.codec_settings->width,
273 RTC_CHECK(frame_reader_->Init()); 285 config_.codec_settings->height));
274 RTC_CHECK(frame_writer_->Init()); 286 RTC_CHECK(analysis_frame_reader_->Init());
287 RTC_CHECK(analysis_frame_writer_->Init());
288
289 if (visualization_params) {
290 // clang-format off
291 const std::string output_filename_base =
292 test::OutputPath() + process.filename +
293 "_cd-" + CodecTypeToPayloadName(process.codec_type).value_or("") +
294 "_hw-" + std::to_string(process.hw_codec) +
295 "_fr-" + std::to_string(start_frame_rate_) +
296 "_br-" + std::to_string(static_cast<int>(start_bitrate_));
297 // clang-format on
298 if (visualization_params->save_source_y4m) {
299 source_frame_writer_.reset(new test::Y4mFrameWriterImpl(
300 output_filename_base + "_source.y4m", config_.codec_settings->width,
301 config_.codec_settings->height, start_frame_rate_));
302 RTC_CHECK(source_frame_writer_->Init());
303 }
304 if (visualization_params->save_encoded_ivf) {
305 rtc::File post_encode_file =
306 rtc::File::Create(output_filename_base + "_encoded.ivf");
307 encoded_frame_writer_ =
308 IvfFileWriter::Wrap(std::move(post_encode_file), 0);
309 }
310 if (visualization_params->save_decoded_y4m) {
311 decoded_frame_writer_.reset(new test::Y4mFrameWriterImpl(
312 output_filename_base + "_decoded.y4m",
313 config_.codec_settings->width, config_.codec_settings->height,
314 start_frame_rate_));
315 RTC_CHECK(decoded_frame_writer_->Init());
316 }
317 }
275 318
276 packet_manipulator_.reset(new test::PacketManipulatorImpl( 319 packet_manipulator_.reset(new test::PacketManipulatorImpl(
277 &packet_reader_, config_.networking_config, config_.verbose)); 320 &packet_reader_, config_.networking_config, config_.verbose));
278 processor_.reset(new test::VideoProcessorImpl( 321 processor_.reset(new test::VideoProcessorImpl(
279 encoder_.get(), decoder_.get(), frame_reader_.get(), 322 encoder_.get(), decoder_.get(), analysis_frame_reader_.get(),
280 frame_writer_.get(), packet_manipulator_.get(), config_, &stats_)); 323 analysis_frame_writer_.get(), packet_manipulator_.get(), config_,
324 &stats_, source_frame_writer_.get(), encoded_frame_writer_.get(),
325 decoded_frame_writer_.get()));
281 RTC_CHECK(processor_->Init()); 326 RTC_CHECK(processor_->Init());
282 } 327 }
283 328
284 // Reset quantities after each encoder update, update the target 329 // Reset quantities after each encoder update, update the target
285 // per-frame bandwidth. 330 // per-frame bandwidth.
286 void ResetRateControlMetrics(int num_frames) { 331 void ResetRateControlMetrics(int num_frames) {
287 for (int i = 0; i < num_temporal_layers_; i++) { 332 for (int i = 0; i < num_temporal_layers_; i++) {
288 num_frames_per_update_[i] = 0; 333 num_frames_per_update_[i] = 0;
289 sum_frame_size_mismatch_[i] = 0.0f; 334 sum_frame_size_mismatch_[i] = 0.0f;
290 sum_encoded_frame_size_[i] = 0.0f; 335 sum_encoded_frame_size_[i] = 0.0f;
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 } 501 }
457 if (num_temporal_layers_ == 3) { 502 if (num_temporal_layers_ == 3) {
458 frame_rate_layer_[2] = frame_rate_ / 2.0f; 503 frame_rate_layer_[2] = frame_rate_ / 2.0f;
459 } 504 }
460 } 505 }
461 506
462 // Processes all frames in the clip and verifies the result. 507 // Processes all frames in the clip and verifies the result.
463 void ProcessFramesAndVerify(QualityMetrics quality_metrics, 508 void ProcessFramesAndVerify(QualityMetrics quality_metrics,
464 RateProfile rate_profile, 509 RateProfile rate_profile,
465 CodecConfigPars process, 510 CodecConfigPars process,
466 RateControlMetrics* rc_metrics) { 511 RateControlMetrics* rc_metrics,
512 const VisualizationParams* visualization_params) {
467 // Codec/config settings. 513 // Codec/config settings.
468 start_bitrate_ = rate_profile.target_bit_rate[0]; 514 start_bitrate_ = rate_profile.target_bit_rate[0];
515 start_frame_rate_ = rate_profile.input_frame_rate[0];
469 packet_loss_ = process.packet_loss; 516 packet_loss_ = process.packet_loss;
470 num_temporal_layers_ = process.num_temporal_layers; 517 num_temporal_layers_ = process.num_temporal_layers;
471 SetUpCodecConfig(process); 518 SetUpCodecConfig(process, visualization_params);
472 // Update the layers and the codec with the initial rates. 519 // Update the layers and the codec with the initial rates.
473 bit_rate_ = rate_profile.target_bit_rate[0]; 520 bit_rate_ = rate_profile.target_bit_rate[0];
474 frame_rate_ = rate_profile.input_frame_rate[0]; 521 frame_rate_ = rate_profile.input_frame_rate[0];
475 SetLayerRates(); 522 SetLayerRates();
476 // Set the initial target size for key frame. 523 // Set the initial target size for key frame.
477 target_size_key_frame_initial_ = 524 target_size_key_frame_initial_ =
478 0.5 * kInitialBufferSize * bit_rate_layer_[0]; 525 0.5 * kInitialBufferSize * bit_rate_layer_[0];
479 processor_->SetRates(bit_rate_, frame_rate_); 526 processor_->SetRates(bit_rate_, frame_rate_);
480 527
481 // Process each frame, up to |num_frames|. 528 // Process each frame, up to |num_frames|.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 rc_metrics[update_index].max_num_dropped_frames, 574 rc_metrics[update_index].max_num_dropped_frames,
528 rc_metrics[update_index].num_spatial_resizes, 575 rc_metrics[update_index].num_spatial_resizes,
529 rc_metrics[update_index].num_key_frames); 576 rc_metrics[update_index].num_key_frames);
530 EXPECT_EQ(num_frames, frame_number); 577 EXPECT_EQ(num_frames, frame_number);
531 EXPECT_EQ(num_frames + 1, static_cast<int>(stats_.stats_.size())); 578 EXPECT_EQ(num_frames + 1, static_cast<int>(stats_.stats_.size()));
532 579
533 // Release encoder and decoder to make sure they have finished processing: 580 // Release encoder and decoder to make sure they have finished processing:
534 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release()); 581 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
535 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->Release()); 582 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->Release());
536 583
537 // Close the files before we start using them for SSIM/PSNR calculations. 584 // Close the analysis files before we use them for SSIM/PSNR calculations.
538 frame_reader_->Close(); 585 analysis_frame_reader_->Close();
539 frame_writer_->Close(); 586 analysis_frame_writer_->Close();
540 587
541 // TODO(marpan): should compute these quality metrics per SetRates update. 588 // Close visualization files.
589 if (source_frame_writer_) {
590 source_frame_writer_->Close();
591 }
592 if (encoded_frame_writer_) {
593 encoded_frame_writer_->Close();
594 }
595 if (decoded_frame_writer_) {
596 decoded_frame_writer_->Close();
597 }
598
599 // TODO(marpan): Should compute these quality metrics per SetRates update.
542 test::QualityMetricsResult psnr_result, ssim_result; 600 test::QualityMetricsResult psnr_result, ssim_result;
543 EXPECT_EQ(0, test::I420MetricsFromFiles(config_.input_filename.c_str(), 601 EXPECT_EQ(0, test::I420MetricsFromFiles(config_.input_filename.c_str(),
544 config_.output_filename.c_str(), 602 config_.output_filename.c_str(),
545 config_.codec_settings->width, 603 config_.codec_settings->width,
546 config_.codec_settings->height, 604 config_.codec_settings->height,
547 &psnr_result, &ssim_result)); 605 &psnr_result, &ssim_result));
548 printf("PSNR avg: %f, min: %f\nSSIM avg: %f, min: %f\n", 606 printf("PSNR avg: %f, min: %f\nSSIM avg: %f, min: %f\n",
549 psnr_result.average, psnr_result.min, ssim_result.average, 607 psnr_result.average, psnr_result.min, ssim_result.average,
550 ssim_result.min); 608 ssim_result.min);
551 stats_.PrintSummary(); 609 stats_.PrintSummary();
552 EXPECT_GT(psnr_result.average, quality_metrics.minimum_avg_psnr); 610 EXPECT_GT(psnr_result.average, quality_metrics.minimum_avg_psnr);
553 EXPECT_GT(psnr_result.min, quality_metrics.minimum_min_psnr); 611 EXPECT_GT(psnr_result.min, quality_metrics.minimum_min_psnr);
554 EXPECT_GT(ssim_result.average, quality_metrics.minimum_avg_ssim); 612 EXPECT_GT(ssim_result.average, quality_metrics.minimum_avg_ssim);
555 EXPECT_GT(ssim_result.min, quality_metrics.minimum_min_ssim); 613 EXPECT_GT(ssim_result.min, quality_metrics.minimum_min_ssim);
614
615 // Remove analysis file.
556 if (remove(config_.output_filename.c_str()) < 0) { 616 if (remove(config_.output_filename.c_str()) < 0) {
557 fprintf(stderr, "Failed to remove temporary file!\n"); 617 fprintf(stderr, "Failed to remove temporary file!\n");
558 } 618 }
559 } 619 }
560 620
561 static void SetRateProfilePars(RateProfile* rate_profile,
562 int update_index,
563 int bit_rate,
564 int frame_rate,
565 int frame_index_rate_update) {
566 rate_profile->target_bit_rate[update_index] = bit_rate;
567 rate_profile->input_frame_rate[update_index] = frame_rate;
568 rate_profile->frame_index_rate_update[update_index] =
569 frame_index_rate_update;
570 }
571
572 static void SetCodecParameters(CodecConfigPars* process_settings, 621 static void SetCodecParameters(CodecConfigPars* process_settings,
573 VideoCodecType codec_type, 622 VideoCodecType codec_type,
574 bool hw_codec, 623 bool hw_codec,
575 bool use_single_core, 624 bool use_single_core,
576 float packet_loss, 625 float packet_loss,
577 int key_frame_interval, 626 int key_frame_interval,
578 int num_temporal_layers, 627 int num_temporal_layers,
579 bool error_concealment_on, 628 bool error_concealment_on,
580 bool denoising_on, 629 bool denoising_on,
581 bool frame_dropper_on, 630 bool frame_dropper_on,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 double minimum_avg_psnr, 671 double minimum_avg_psnr,
623 double minimum_min_psnr, 672 double minimum_min_psnr,
624 double minimum_avg_ssim, 673 double minimum_avg_ssim,
625 double minimum_min_ssim) { 674 double minimum_min_ssim) {
626 quality_metrics->minimum_avg_psnr = minimum_avg_psnr; 675 quality_metrics->minimum_avg_psnr = minimum_avg_psnr;
627 quality_metrics->minimum_min_psnr = minimum_min_psnr; 676 quality_metrics->minimum_min_psnr = minimum_min_psnr;
628 quality_metrics->minimum_avg_ssim = minimum_avg_ssim; 677 quality_metrics->minimum_avg_ssim = minimum_avg_ssim;
629 quality_metrics->minimum_min_ssim = minimum_min_ssim; 678 quality_metrics->minimum_min_ssim = minimum_min_ssim;
630 } 679 }
631 680
681 static void SetRateProfilePars(RateProfile* rate_profile,
682 int update_index,
683 int bit_rate,
684 int frame_rate,
685 int frame_index_rate_update) {
686 rate_profile->target_bit_rate[update_index] = bit_rate;
687 rate_profile->input_frame_rate[update_index] = frame_rate;
688 rate_profile->frame_index_rate_update[update_index] =
689 frame_index_rate_update;
690 }
691
632 static void SetRateControlMetrics(RateControlMetrics* rc_metrics, 692 static void SetRateControlMetrics(RateControlMetrics* rc_metrics,
633 int update_index, 693 int update_index,
634 int max_num_dropped_frames, 694 int max_num_dropped_frames,
635 int max_key_frame_size_mismatch, 695 int max_key_frame_size_mismatch,
636 int max_delta_frame_size_mismatch, 696 int max_delta_frame_size_mismatch,
637 int max_encoding_rate_mismatch, 697 int max_encoding_rate_mismatch,
638 int max_time_hit_target, 698 int max_time_hit_target,
639 int num_spatial_resizes, 699 int num_spatial_resizes,
640 int num_key_frames) { 700 int num_key_frames) {
641 rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames; 701 rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames;
642 rc_metrics[update_index].max_key_frame_size_mismatch = 702 rc_metrics[update_index].max_key_frame_size_mismatch =
643 max_key_frame_size_mismatch; 703 max_key_frame_size_mismatch;
644 rc_metrics[update_index].max_delta_frame_size_mismatch = 704 rc_metrics[update_index].max_delta_frame_size_mismatch =
645 max_delta_frame_size_mismatch; 705 max_delta_frame_size_mismatch;
646 rc_metrics[update_index].max_encoding_rate_mismatch = 706 rc_metrics[update_index].max_encoding_rate_mismatch =
647 max_encoding_rate_mismatch; 707 max_encoding_rate_mismatch;
648 rc_metrics[update_index].max_time_hit_target = max_time_hit_target; 708 rc_metrics[update_index].max_time_hit_target = max_time_hit_target;
649 rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes; 709 rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes;
650 rc_metrics[update_index].num_key_frames = num_key_frames; 710 rc_metrics[update_index].num_key_frames = num_key_frames;
651 } 711 }
652 712
713 // Codecs.
653 std::unique_ptr<VideoEncoder> encoder_; 714 std::unique_ptr<VideoEncoder> encoder_;
654 std::unique_ptr<cricket::WebRtcVideoEncoderFactory> external_encoder_factory_; 715 std::unique_ptr<cricket::WebRtcVideoEncoderFactory> external_encoder_factory_;
655 std::unique_ptr<VideoDecoder> decoder_; 716 std::unique_ptr<VideoDecoder> decoder_;
656 std::unique_ptr<cricket::WebRtcVideoDecoderFactory> external_decoder_factory_; 717 std::unique_ptr<cricket::WebRtcVideoDecoderFactory> external_decoder_factory_;
657 std::unique_ptr<test::FrameReader> frame_reader_; 718 VideoCodec codec_settings_;
658 std::unique_ptr<test::FrameWriter> frame_writer_; 719
720 // Helper objects.
721 std::unique_ptr<test::FrameReader> analysis_frame_reader_;
722 std::unique_ptr<test::FrameWriter> analysis_frame_writer_;
659 test::PacketReader packet_reader_; 723 test::PacketReader packet_reader_;
660 std::unique_ptr<test::PacketManipulator> packet_manipulator_; 724 std::unique_ptr<test::PacketManipulator> packet_manipulator_;
661 test::Stats stats_; 725 test::Stats stats_;
662 test::TestConfig config_; 726 test::TestConfig config_;
663 VideoCodec codec_settings_;
664 // Must be destroyed before |encoder_| and |decoder_|. 727 // Must be destroyed before |encoder_| and |decoder_|.
665 std::unique_ptr<test::VideoProcessor> processor_; 728 std::unique_ptr<test::VideoProcessor> processor_;
666 TemporalLayersFactory tl_factory_; 729
730 // Visualization objects.
731 std::unique_ptr<test::FrameWriter> source_frame_writer_;
732 std::unique_ptr<IvfFileWriter> encoded_frame_writer_;
733 std::unique_ptr<test::FrameWriter> decoded_frame_writer_;
667 734
668 // Quantities defined/updated for every encoder rate update. 735 // Quantities defined/updated for every encoder rate update.
669 // Some quantities defined per temporal layer (at most 3 layers in this test). 736 // Some quantities defined per temporal layer (at most 3 layers in this test).
670 int num_frames_per_update_[3]; 737 int num_frames_per_update_[3];
671 float sum_frame_size_mismatch_[3]; 738 float sum_frame_size_mismatch_[3];
672 float sum_encoded_frame_size_[3]; 739 float sum_encoded_frame_size_[3];
673 float encoding_bitrate_[3]; 740 float encoding_bitrate_[3];
674 float per_frame_bandwidth_[3]; 741 float per_frame_bandwidth_[3];
675 float bit_rate_layer_[3]; 742 float bit_rate_layer_[3];
676 float frame_rate_layer_[3]; 743 float frame_rate_layer_[3];
677 int num_frames_total_; 744 int num_frames_total_;
678 float sum_encoded_frame_size_total_; 745 float sum_encoded_frame_size_total_;
679 float encoding_bitrate_total_; 746 float encoding_bitrate_total_;
680 float perc_encoding_rate_mismatch_; 747 float perc_encoding_rate_mismatch_;
681 int num_frames_to_hit_target_; 748 int num_frames_to_hit_target_;
682 bool encoding_rate_within_target_; 749 bool encoding_rate_within_target_;
683 int bit_rate_; 750 int bit_rate_;
684 int frame_rate_; 751 int frame_rate_;
685 int layer_; 752 int layer_;
686 float target_size_key_frame_initial_; 753 float target_size_key_frame_initial_;
687 float target_size_key_frame_; 754 float target_size_key_frame_;
688 float sum_key_frame_size_mismatch_; 755 float sum_key_frame_size_mismatch_;
689 int num_key_frames_; 756 int num_key_frames_;
690 float start_bitrate_; 757 float start_bitrate_;
758 int start_frame_rate_;
691 759
692 // Codec and network settings. 760 // Codec and network settings.
693 float packet_loss_; 761 float packet_loss_;
694 int num_temporal_layers_; 762 int num_temporal_layers_;
695 }; 763 };
696 764
697 } // namespace test 765 } // namespace test
698 } // namespace webrtc 766 } // namespace webrtc
699 767
700 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTES T_H_ 768 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTES T_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698