VideoProcessorIntegrationTest: Group member variables into two structs containing target/actual rates.

- Group member variables into two structs: target rates/actual rates.
- Split verify and print of rate control metrics into separate functions.
- Rename member variables.

BUG=webrtc:6634

Review-Url: https://codereview.webrtc.org/3009423002
Cr-Commit-Position: refs/heads/master@{#19925}
This commit is contained in:
asapersson
2017-09-22 03:45:15 -07:00
committed by Commit Bot
parent 22d3da9235
commit 55c7eded94
2 changed files with 233 additions and 207 deletions

View File

@ -31,8 +31,7 @@ namespace webrtc {
namespace test {
// The sequence of bit rate and frame rate changes for the encoder, the frame
// number where the changes are made, and the total number of frames for the
// test.
// number where the changes are made, and the total number of frames to process.
struct RateProfile {
static const int kMaxNumRateUpdates = 3;
@ -42,17 +41,16 @@ struct RateProfile {
int num_frames;
};
// Thresholds for the rate control metrics. The rate mismatch thresholds are
// defined as percentages. |max_time_hit_target| is defined as number of frames,
// after a rate update is made to the encoder, for the encoder to reach within
// |kPercTargetvsActualMismatch| of new target rate. The thresholds are defined
// for each rate update sequence.
// Thresholds for the rate control metrics. The thresholds are defined for each
// rate update sequence. |max_num_frames_to_hit_target| is defined as number of
// frames, after a rate update is made to the encoder, for the encoder to reach
// |kMaxBitrateMismatchPercent| of new target rate.
struct RateControlThresholds {
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 max_key_framesize_mismatch_percent;
int max_delta_framesize_mismatch_percent;
int max_bitrate_mismatch_percent;
int max_num_frames_to_hit_target;
int num_spatial_resizes;
int num_key_frames;
};
@ -112,10 +110,10 @@ class VideoProcessorIntegrationTest : public testing::Test {
static void AddRateControlThresholds(
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 max_key_framesize_mismatch_percent,
int max_delta_framesize_mismatch_percent,
int max_bitrate_mismatch_percent,
int max_num_frames_to_hit_target,
int num_spatial_resizes,
int num_key_frames,
std::vector<RateControlThresholds>* rc_thresholds);
@ -132,6 +130,44 @@ class VideoProcessorIntegrationTest : public testing::Test {
private:
static const int kMaxNumTemporalLayers = 3;
struct TestResults {
int KeyFrameSizeMismatchPercent() const {
if (num_key_frames == 0) {
return -1;
}
return 100 * sum_key_framesize_mismatch / num_key_frames;
}
int DeltaFrameSizeMismatchPercent(int i) const {
return 100 * sum_delta_framesize_mismatch_layer[i] / num_frames_layer[i];
}
int BitrateMismatchPercent(float target_kbps) const {
return 100 * fabs(kbps - target_kbps) / target_kbps;
}
int BitrateMismatchPercent(int i, float target_kbps_layer) const {
return 100 * fabs(kbps_layer[i] - target_kbps_layer) / target_kbps_layer;
}
int num_frames = 0;
int num_frames_layer[kMaxNumTemporalLayers] = {0};
int num_key_frames = 0;
int num_frames_to_hit_target = 0;
float sum_framesize_kbits = 0.0f;
float sum_framesize_kbits_layer[kMaxNumTemporalLayers] = {0};
float kbps = 0.0f;
float kbps_layer[kMaxNumTemporalLayers] = {0};
float sum_key_framesize_mismatch = 0.0f;
float sum_delta_framesize_mismatch_layer[kMaxNumTemporalLayers] = {0};
};
struct TargetRates {
int kbps;
int fps;
float kbps_layer[kMaxNumTemporalLayers];
float fps_layer[kMaxNumTemporalLayers];
float framesize_kbits_layer[kMaxNumTemporalLayers];
float key_framesize_kbits_initial;
float key_framesize_kbits;
};
void CreateEncoderAndDecoder();
void DestroyEncoderAndDecoder();
void SetUpAndInitObjects(rtc::TaskQueue* task_queue,
@ -139,15 +175,22 @@ class VideoProcessorIntegrationTest : public testing::Test {
const int initial_framerate_fps,
const VisualizationParams* visualization_params);
void ReleaseAndCloseObjects(rtc::TaskQueue* task_queue);
int TemporalLayerIndexForFrame(int frame_number) const;
// Rate control metrics.
void ResetRateControlMetrics(int rate_update_index,
const RateProfile& rate_profile);
void SetRatesPerTemporalLayer();
void UpdateRateControlMetrics(int frame_number);
void PrintAndMaybeVerifyRateControlMetrics(
void PrintRateControlMetrics(
int rate_update_index,
const std::vector<int>& num_dropped_frames,
const std::vector<int>& num_spatial_resizes) const;
void VerifyRateControlMetrics(
int rate_update_index,
const std::vector<RateControlThresholds>* rc_thresholds,
const std::vector<int>& num_dropped_frames,
const std::vector<int>& num_resize_actions);
int TemporalLayerIndexForFrame(int frame_number) const;
void ResetRateControlMetrics(int rate_update_index,
const RateProfile& rate_profile);
const std::vector<int>& num_spatial_resizes) const;
// Codecs.
std::unique_ptr<VideoEncoder> encoder_;
@ -164,26 +207,11 @@ class VideoProcessorIntegrationTest : public testing::Test {
Stats stats_;
std::unique_ptr<VideoProcessor> processor_;
// Quantities defined/updated for every encoder rate update.
int num_frames_per_update_[kMaxNumTemporalLayers];
float sum_frame_size_mismatch_[kMaxNumTemporalLayers];
float sum_encoded_frame_size_[kMaxNumTemporalLayers];
float encoding_bitrate_[kMaxNumTemporalLayers];
float per_frame_bandwidth_[kMaxNumTemporalLayers];
float bitrate_layer_[kMaxNumTemporalLayers];
float framerate_layer_[kMaxNumTemporalLayers];
int num_frames_total_;
float sum_encoded_frame_size_total_;
float encoding_bitrate_total_;
float perc_encoding_rate_mismatch_;
int num_frames_to_hit_target_;
bool encoding_rate_within_target_;
int bitrate_kbps_;
int framerate_;
float target_size_key_frame_initial_;
float target_size_key_frame_;
float sum_key_frame_size_mismatch_;
int num_key_frames_;
// Quantities updated for every encoded frame.
TestResults actual_;
// Rates set for every encoder rate update.
TargetRates target_;
};
} // namespace test