Index: webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc |
diff --git a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc |
index d7b643bf1c90213790475343a98b01d67a7c8403..e4b20e2c96f6a7642ab1f3cfb40377233d0bab75 100644 |
--- a/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc |
+++ b/webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc |
@@ -10,6 +10,8 @@ |
#include <math.h> |
+#include <memory> |
+ |
#include "webrtc/modules/video_coding/codecs/h264/include/h264.h" |
#include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h" |
#include "webrtc/modules/video_coding/codecs/test/videoprocessor.h" |
@@ -28,7 +30,7 @@ |
#include "webrtc/typedefs.h" |
namespace webrtc { |
- |
+namespace { |
// Maximum number of rate updates (i.e., calls to encoder to change bitrate |
// and/or frame rate) for the current tests. |
const int kMaxNumRateUpdates = 3; |
@@ -94,6 +96,68 @@ const float kInitialBufferSize = 0.5f; |
const float kOptimalBufferSize = 0.6f; |
const float kScaleKeyFrameSize = 0.5f; |
+void SetRateProfilePars(RateProfile* rate_profile, |
+ int update_index, |
+ int bit_rate, |
+ int frame_rate, |
+ int frame_index_rate_update) { |
+ rate_profile->target_bit_rate[update_index] = bit_rate; |
+ rate_profile->input_frame_rate[update_index] = frame_rate; |
+ rate_profile->frame_index_rate_update[update_index] = frame_index_rate_update; |
+} |
+ |
+void SetCodecParameters(CodecConfigPars* process_settings, |
+ VideoCodecType codec_type, |
+ float packet_loss, |
+ int key_frame_interval, |
+ int num_temporal_layers, |
+ bool error_concealment_on, |
+ bool denoising_on, |
+ bool frame_dropper_on, |
+ bool spatial_resize_on) { |
+ process_settings->codec_type = codec_type; |
+ process_settings->packet_loss = packet_loss; |
+ process_settings->key_frame_interval = key_frame_interval; |
+ process_settings->num_temporal_layers = num_temporal_layers, |
+ process_settings->error_concealment_on = error_concealment_on; |
+ process_settings->denoising_on = denoising_on; |
+ process_settings->frame_dropper_on = frame_dropper_on; |
+ process_settings->spatial_resize_on = spatial_resize_on; |
+} |
+ |
+void SetQualityMetrics(QualityMetrics* quality_metrics, |
+ double minimum_avg_psnr, |
+ double minimum_min_psnr, |
+ double minimum_avg_ssim, |
+ double minimum_min_ssim) { |
+ quality_metrics->minimum_avg_psnr = minimum_avg_psnr; |
+ quality_metrics->minimum_min_psnr = minimum_min_psnr; |
+ quality_metrics->minimum_avg_ssim = minimum_avg_ssim; |
+ quality_metrics->minimum_min_ssim = minimum_min_ssim; |
+} |
+ |
+void SetRateControlMetrics(RateControlMetrics* rc_metrics, |
+ int update_index, |
+ int max_num_dropped_frames, |
+ int max_key_frame_size_mismatch, |
+ int max_delta_frame_size_mismatch, |
+ int max_encoding_rate_mismatch, |
+ int max_time_hit_target, |
+ int num_spatial_resizes, |
+ int num_key_frames) { |
+ rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames; |
+ rc_metrics[update_index].max_key_frame_size_mismatch = |
+ max_key_frame_size_mismatch; |
+ rc_metrics[update_index].max_delta_frame_size_mismatch = |
+ max_delta_frame_size_mismatch; |
+ rc_metrics[update_index].max_encoding_rate_mismatch = |
+ max_encoding_rate_mismatch; |
+ rc_metrics[update_index].max_time_hit_target = max_time_hit_target; |
+ rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes; |
+ rc_metrics[update_index].num_key_frames = num_key_frames; |
+} |
+} // namespace |
+ |
// Integration test for video processor. Encodes+decodes a clip and |
// writes it to the output directory. After completion, quality metrics |
// (PSNR and SSIM) and rate control metrics are computed to verify that the |
@@ -104,16 +168,16 @@ const float kScaleKeyFrameSize = 0.5f; |
// happen when some significant regression or breakdown occurs. |
class VideoProcessorIntegrationTest : public testing::Test { |
protected: |
- VideoEncoder* encoder_; |
- VideoDecoder* decoder_; |
- webrtc::test::FrameReader* frame_reader_; |
- webrtc::test::FrameWriter* frame_writer_; |
- webrtc::test::PacketReader packet_reader_; |
- webrtc::test::PacketManipulator* packet_manipulator_; |
- webrtc::test::Stats stats_; |
- webrtc::test::TestConfig config_; |
+ std::unique_ptr<VideoEncoder> encoder_; |
+ std::unique_ptr<VideoDecoder> decoder_; |
+ std::unique_ptr<test::FrameReader> frame_reader_; |
+ std::unique_ptr<test::FrameWriter> frame_writer_; |
+ test::PacketReader packet_reader_; |
+ std::unique_ptr<test::PacketManipulator> packet_manipulator_; |
+ test::Stats stats_; |
+ test::TestConfig config_; |
VideoCodec codec_settings_; |
- webrtc::test::VideoProcessor* processor_; |
+ std::unique_ptr<test::VideoProcessor> processor_; |
TemporalLayersFactory tl_factory_; |
// Quantities defined/updated for every encoder rate update. |
@@ -155,16 +219,16 @@ class VideoProcessorIntegrationTest : public testing::Test { |
void SetUpCodecConfig() { |
if (codec_type_ == kVideoCodecH264) { |
- encoder_ = H264Encoder::Create(cricket::VideoCodec("H264")); |
- decoder_ = H264Decoder::Create(); |
+ encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264"))); |
+ decoder_.reset(H264Decoder::Create()); |
VideoCodingModule::Codec(kVideoCodecH264, &codec_settings_); |
} else if (codec_type_ == kVideoCodecVP8) { |
- encoder_ = VP8Encoder::Create(); |
- decoder_ = VP8Decoder::Create(); |
+ encoder_.reset(VP8Encoder::Create()); |
+ decoder_.reset(VP8Decoder::Create()); |
VideoCodingModule::Codec(kVideoCodecVP8, &codec_settings_); |
} else if (codec_type_ == kVideoCodecVP9) { |
- encoder_ = VP9Encoder::Create(); |
- decoder_ = VP9Decoder::Create(); |
+ encoder_.reset(VP9Encoder::Create()); |
+ decoder_.reset(VP9Decoder::Create()); |
VideoCodingModule::Codec(kVideoCodecVP9, &codec_settings_); |
} |
@@ -219,19 +283,19 @@ class VideoProcessorIntegrationTest : public testing::Test { |
assert(false); |
break; |
} |
- frame_reader_ = new webrtc::test::FrameReaderImpl( |
+ frame_reader_.reset(new test::FrameReaderImpl( |
config_.input_filename, config_.codec_settings->width, |
- config_.codec_settings->height); |
- frame_writer_ = new webrtc::test::FrameWriterImpl( |
- config_.output_filename, config_.frame_length_in_bytes); |
+ config_.codec_settings->height)); |
+ frame_writer_.reset(new test::FrameWriterImpl( |
+ config_.output_filename, config_.frame_length_in_bytes)); |
ASSERT_TRUE(frame_reader_->Init()); |
ASSERT_TRUE(frame_writer_->Init()); |
- packet_manipulator_ = new webrtc::test::PacketManipulatorImpl( |
- &packet_reader_, config_.networking_config, config_.verbose); |
- processor_ = new webrtc::test::VideoProcessorImpl( |
- encoder_, decoder_, frame_reader_, frame_writer_, packet_manipulator_, |
- config_, &stats_); |
+ packet_manipulator_.reset(new test::PacketManipulatorImpl( |
+ &packet_reader_, config_.networking_config, config_.verbose)); |
+ processor_.reset(new test::VideoProcessorImpl( |
+ encoder_.get(), decoder_.get(), frame_reader_.get(), |
+ frame_writer_.get(), packet_manipulator_.get(), config_, &stats_)); |
ASSERT_TRUE(processor_->Init()); |
} |
@@ -319,9 +383,9 @@ class VideoProcessorIntegrationTest : public testing::Test { |
" Frame rate: %d \n", |
update_index, bit_rate_, encoding_bitrate_total_, frame_rate_); |
printf( |
- " Number of frames to approach target rate = %d, \n" |
- " Number of dropped frames = %d, \n" |
- " Number of spatial resizes = %d, \n", |
+ " Number of frames to approach target rate: %d, \n" |
+ " 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_, max_encoding_rate_mismatch); |
if (num_key_frames_ > 0) { |
@@ -336,7 +400,7 @@ class VideoProcessorIntegrationTest : public testing::Test { |
printf("\n"); |
printf("Rates statistics for Layer data \n"); |
for (int i = 0; i < num_temporal_layers_; i++) { |
- printf("Layer #%d \n", i); |
+ printf("Temporal layer #%d \n", i); |
int perc_frame_size_mismatch = |
100 * sum_frame_size_mismatch_[i] / num_frames_per_update_[i]; |
int perc_encoding_rate_mismatch = |
@@ -348,8 +412,8 @@ class VideoProcessorIntegrationTest : public testing::Test { |
" Layer per frame bandwidth: %f, \n" |
" Layer Encoding bit rate: %f, \n" |
" Layer Percent frame size mismatch: %d, \n" |
- " Layer Percent encoding rate mismatch = %d, \n" |
- " Number of frame processed per layer = %d \n", |
+ " Layer Percent encoding rate mismatch: %d, \n" |
+ " Number of frame processed per layer: %d \n", |
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]); |
@@ -413,15 +477,6 @@ class VideoProcessorIntegrationTest : public testing::Test { |
} |
} |
- void TearDown() { |
- delete processor_; |
- delete packet_manipulator_; |
- delete frame_writer_; |
- delete frame_reader_; |
- delete decoder_; |
- delete encoder_; |
- } |
- |
// Processes all frames in the clip and verifies the result. |
void ProcessFramesAndVerify(QualityMetrics quality_metrics, |
RateProfile rate_profile, |
@@ -506,13 +561,13 @@ class VideoProcessorIntegrationTest : public testing::Test { |
frame_writer_->Close(); |
// TODO(marpan): should compute these quality metrics per SetRates update. |
- webrtc::test::QualityMetricsResult psnr_result, ssim_result; |
- EXPECT_EQ( |
- 0, webrtc::test::I420MetricsFromFiles( |
- config_.input_filename.c_str(), config_.output_filename.c_str(), |
- config_.codec_settings->width, config_.codec_settings->height, |
- &psnr_result, &ssim_result)); |
- printf("PSNR avg: %f, min: %f SSIM avg: %f, min: %f\n", |
+ test::QualityMetricsResult psnr_result, ssim_result; |
+ EXPECT_EQ(0, test::I420MetricsFromFiles(config_.input_filename.c_str(), |
+ config_.output_filename.c_str(), |
+ config_.codec_settings->width, |
+ config_.codec_settings->height, |
+ &psnr_result, &ssim_result)); |
+ printf("PSNR avg: %f, min: %f\nSSIM avg: %f, min: %f\n", |
psnr_result.average, psnr_result.min, ssim_result.average, |
ssim_result.min); |
stats_.PrintSummary(); |
@@ -526,67 +581,6 @@ class VideoProcessorIntegrationTest : public testing::Test { |
} |
}; |
-void SetRateProfilePars(RateProfile* rate_profile, |
- int update_index, |
- int bit_rate, |
- int frame_rate, |
- int frame_index_rate_update) { |
- rate_profile->target_bit_rate[update_index] = bit_rate; |
- rate_profile->input_frame_rate[update_index] = frame_rate; |
- rate_profile->frame_index_rate_update[update_index] = frame_index_rate_update; |
-} |
- |
-void SetCodecParameters(CodecConfigPars* process_settings, |
- VideoCodecType codec_type, |
- float packet_loss, |
- int key_frame_interval, |
- int num_temporal_layers, |
- bool error_concealment_on, |
- bool denoising_on, |
- bool frame_dropper_on, |
- bool spatial_resize_on) { |
- process_settings->codec_type = codec_type; |
- process_settings->packet_loss = packet_loss; |
- process_settings->key_frame_interval = key_frame_interval; |
- process_settings->num_temporal_layers = num_temporal_layers, |
- process_settings->error_concealment_on = error_concealment_on; |
- process_settings->denoising_on = denoising_on; |
- process_settings->frame_dropper_on = frame_dropper_on; |
- process_settings->spatial_resize_on = spatial_resize_on; |
-} |
- |
-void SetQualityMetrics(QualityMetrics* quality_metrics, |
- double minimum_avg_psnr, |
- double minimum_min_psnr, |
- double minimum_avg_ssim, |
- double minimum_min_ssim) { |
- quality_metrics->minimum_avg_psnr = minimum_avg_psnr; |
- quality_metrics->minimum_min_psnr = minimum_min_psnr; |
- quality_metrics->minimum_avg_ssim = minimum_avg_ssim; |
- quality_metrics->minimum_min_ssim = minimum_min_ssim; |
-} |
- |
-void SetRateControlMetrics(RateControlMetrics* rc_metrics, |
- int update_index, |
- int max_num_dropped_frames, |
- int max_key_frame_size_mismatch, |
- int max_delta_frame_size_mismatch, |
- int max_encoding_rate_mismatch, |
- int max_time_hit_target, |
- int num_spatial_resizes, |
- int num_key_frames) { |
- rc_metrics[update_index].max_num_dropped_frames = max_num_dropped_frames; |
- rc_metrics[update_index].max_key_frame_size_mismatch = |
- max_key_frame_size_mismatch; |
- rc_metrics[update_index].max_delta_frame_size_mismatch = |
- max_delta_frame_size_mismatch; |
- rc_metrics[update_index].max_encoding_rate_mismatch = |
- max_encoding_rate_mismatch; |
- rc_metrics[update_index].max_time_hit_target = max_time_hit_target; |
- rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes; |
- rc_metrics[update_index].num_key_frames = num_key_frames; |
-} |
- |
#if defined(WEBRTC_VIDEOPROCESSOR_H264_TESTS) |
// H264: Run with no packet loss and fixed bitrate. Quality should be very high. |