OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2017 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 |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "modules/video_coding/utility/ivf_file_writer.h" | 24 #include "modules/video_coding/utility/ivf_file_writer.h" |
25 #include "test/gtest.h" | 25 #include "test/gtest.h" |
26 #include "test/testsupport/frame_reader.h" | 26 #include "test/testsupport/frame_reader.h" |
27 #include "test/testsupport/frame_writer.h" | 27 #include "test/testsupport/frame_writer.h" |
28 #include "test/testsupport/packet_reader.h" | 28 #include "test/testsupport/packet_reader.h" |
29 | 29 |
30 namespace webrtc { | 30 namespace webrtc { |
31 namespace test { | 31 namespace test { |
32 | 32 |
33 // The sequence of bit rate and frame rate changes for the encoder, the frame | 33 // The sequence of bit rate and frame rate changes for the encoder, the frame |
34 // number where the changes are made, and the total number of frames for the | 34 // number where the changes are made, and the total number of frames to process. |
35 // test. | |
36 struct RateProfile { | 35 struct RateProfile { |
37 static const int kMaxNumRateUpdates = 3; | 36 static const int kMaxNumRateUpdates = 3; |
38 | 37 |
39 int target_bit_rate[kMaxNumRateUpdates]; | 38 int target_bit_rate[kMaxNumRateUpdates]; |
40 int input_frame_rate[kMaxNumRateUpdates]; | 39 int input_frame_rate[kMaxNumRateUpdates]; |
41 int frame_index_rate_update[kMaxNumRateUpdates + 1]; | 40 int frame_index_rate_update[kMaxNumRateUpdates + 1]; |
42 int num_frames; | 41 int num_frames; |
43 }; | 42 }; |
44 | 43 |
45 // Thresholds for the rate control metrics. The rate mismatch thresholds are | 44 // Thresholds for the rate control metrics. The thresholds are defined for each |
46 // defined as percentages. |max_time_hit_target| is defined as number of frames, | 45 // rate update sequence. |max_num_frames_to_hit_target| is defined as number of |
47 // after a rate update is made to the encoder, for the encoder to reach within | 46 // frames, after a rate update is made to the encoder, for the encoder to reach |
48 // |kPercTargetvsActualMismatch| of new target rate. The thresholds are defined | 47 // |kMaxBitrateMismatchPercent| of new target rate. |
49 // for each rate update sequence. | |
50 struct RateControlThresholds { | 48 struct RateControlThresholds { |
51 int max_num_dropped_frames; | 49 int max_num_dropped_frames; |
52 int max_key_frame_size_mismatch; | 50 int max_key_framesize_mismatch_percent; |
53 int max_delta_frame_size_mismatch; | 51 int max_delta_framesize_mismatch_percent; |
54 int max_encoding_rate_mismatch; | 52 int max_bitrate_mismatch_percent; |
55 int max_time_hit_target; | 53 int max_num_frames_to_hit_target; |
56 int num_spatial_resizes; | 54 int num_spatial_resizes; |
57 int num_key_frames; | 55 int num_key_frames; |
58 }; | 56 }; |
59 | 57 |
60 // Thresholds for the quality metrics. | 58 // Thresholds for the quality metrics. |
61 struct QualityThresholds { | 59 struct QualityThresholds { |
62 QualityThresholds(double min_avg_psnr, | 60 QualityThresholds(double min_avg_psnr, |
63 double min_min_psnr, | 61 double min_min_psnr, |
64 double min_avg_ssim, | 62 double min_avg_ssim, |
65 double min_min_ssim) | 63 double min_min_ssim) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 int height); | 103 int height); |
106 | 104 |
107 static void SetRateProfile(RateProfile* rate_profile, | 105 static void SetRateProfile(RateProfile* rate_profile, |
108 int rate_update_index, | 106 int rate_update_index, |
109 int bitrate_kbps, | 107 int bitrate_kbps, |
110 int framerate_fps, | 108 int framerate_fps, |
111 int frame_index_rate_update); | 109 int frame_index_rate_update); |
112 | 110 |
113 static void AddRateControlThresholds( | 111 static void AddRateControlThresholds( |
114 int max_num_dropped_frames, | 112 int max_num_dropped_frames, |
115 int max_key_frame_size_mismatch, | 113 int max_key_framesize_mismatch_percent, |
116 int max_delta_frame_size_mismatch, | 114 int max_delta_framesize_mismatch_percent, |
117 int max_encoding_rate_mismatch, | 115 int max_bitrate_mismatch_percent, |
118 int max_time_hit_target, | 116 int max_num_frames_to_hit_target, |
119 int num_spatial_resizes, | 117 int num_spatial_resizes, |
120 int num_key_frames, | 118 int num_key_frames, |
121 std::vector<RateControlThresholds>* rc_thresholds); | 119 std::vector<RateControlThresholds>* rc_thresholds); |
122 | 120 |
123 void ProcessFramesAndMaybeVerify( | 121 void ProcessFramesAndMaybeVerify( |
124 const RateProfile& rate_profile, | 122 const RateProfile& rate_profile, |
125 const std::vector<RateControlThresholds>* rc_thresholds, | 123 const std::vector<RateControlThresholds>* rc_thresholds, |
126 const QualityThresholds* quality_thresholds, | 124 const QualityThresholds* quality_thresholds, |
127 const VisualizationParams* visualization_params); | 125 const VisualizationParams* visualization_params); |
128 | 126 |
129 // Config. | 127 // Config. |
130 TestConfig config_; | 128 TestConfig config_; |
131 | 129 |
132 private: | 130 private: |
133 static const int kMaxNumTemporalLayers = 3; | 131 static const int kMaxNumTemporalLayers = 3; |
134 | 132 |
| 133 struct TestResults { |
| 134 int KeyFrameSizeMismatchPercent() const { |
| 135 if (num_key_frames == 0) { |
| 136 return -1; |
| 137 } |
| 138 return 100 * sum_key_framesize_mismatch / num_key_frames; |
| 139 } |
| 140 int DeltaFrameSizeMismatchPercent(int i) const { |
| 141 return 100 * sum_delta_framesize_mismatch_layer[i] / num_frames_layer[i]; |
| 142 } |
| 143 int BitrateMismatchPercent(float target_kbps) const { |
| 144 return 100 * fabs(kbps - target_kbps) / target_kbps; |
| 145 } |
| 146 int BitrateMismatchPercent(int i, float target_kbps_layer) const { |
| 147 return 100 * fabs(kbps_layer[i] - target_kbps_layer) / target_kbps_layer; |
| 148 } |
| 149 int num_frames = 0; |
| 150 int num_frames_layer[kMaxNumTemporalLayers] = {0}; |
| 151 int num_key_frames = 0; |
| 152 int num_frames_to_hit_target = 0; |
| 153 float sum_framesize_kbits = 0.0f; |
| 154 float sum_framesize_kbits_layer[kMaxNumTemporalLayers] = {0}; |
| 155 float kbps = 0.0f; |
| 156 float kbps_layer[kMaxNumTemporalLayers] = {0}; |
| 157 float sum_key_framesize_mismatch = 0.0f; |
| 158 float sum_delta_framesize_mismatch_layer[kMaxNumTemporalLayers] = {0}; |
| 159 }; |
| 160 |
| 161 struct TargetRates { |
| 162 int kbps; |
| 163 int fps; |
| 164 float kbps_layer[kMaxNumTemporalLayers]; |
| 165 float fps_layer[kMaxNumTemporalLayers]; |
| 166 float framesize_kbits_layer[kMaxNumTemporalLayers]; |
| 167 float key_framesize_kbits_initial; |
| 168 float key_framesize_kbits; |
| 169 }; |
| 170 |
135 void CreateEncoderAndDecoder(); | 171 void CreateEncoderAndDecoder(); |
136 void DestroyEncoderAndDecoder(); | 172 void DestroyEncoderAndDecoder(); |
137 void SetUpAndInitObjects(rtc::TaskQueue* task_queue, | 173 void SetUpAndInitObjects(rtc::TaskQueue* task_queue, |
138 const int initial_bitrate_kbps, | 174 const int initial_bitrate_kbps, |
139 const int initial_framerate_fps, | 175 const int initial_framerate_fps, |
140 const VisualizationParams* visualization_params); | 176 const VisualizationParams* visualization_params); |
141 void ReleaseAndCloseObjects(rtc::TaskQueue* task_queue); | 177 void ReleaseAndCloseObjects(rtc::TaskQueue* task_queue); |
| 178 int TemporalLayerIndexForFrame(int frame_number) const; |
| 179 |
| 180 // Rate control metrics. |
| 181 void ResetRateControlMetrics(int rate_update_index, |
| 182 const RateProfile& rate_profile); |
| 183 void SetRatesPerTemporalLayer(); |
142 void UpdateRateControlMetrics(int frame_number); | 184 void UpdateRateControlMetrics(int frame_number); |
143 void PrintAndMaybeVerifyRateControlMetrics( | 185 void PrintRateControlMetrics( |
| 186 int rate_update_index, |
| 187 const std::vector<int>& num_dropped_frames, |
| 188 const std::vector<int>& num_spatial_resizes) const; |
| 189 void VerifyRateControlMetrics( |
144 int rate_update_index, | 190 int rate_update_index, |
145 const std::vector<RateControlThresholds>* rc_thresholds, | 191 const std::vector<RateControlThresholds>* rc_thresholds, |
146 const std::vector<int>& num_dropped_frames, | 192 const std::vector<int>& num_dropped_frames, |
147 const std::vector<int>& num_resize_actions); | 193 const std::vector<int>& num_spatial_resizes) const; |
148 int TemporalLayerIndexForFrame(int frame_number) const; | |
149 void ResetRateControlMetrics(int rate_update_index, | |
150 const RateProfile& rate_profile); | |
151 | 194 |
152 // Codecs. | 195 // Codecs. |
153 std::unique_ptr<VideoEncoder> encoder_; | 196 std::unique_ptr<VideoEncoder> encoder_; |
154 std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory_; | 197 std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory_; |
155 VideoDecoder* decoder_; | 198 VideoDecoder* decoder_; |
156 | 199 |
157 // Helper objects. | 200 // Helper objects. |
158 std::unique_ptr<FrameReader> analysis_frame_reader_; | 201 std::unique_ptr<FrameReader> analysis_frame_reader_; |
159 std::unique_ptr<FrameWriter> analysis_frame_writer_; | 202 std::unique_ptr<FrameWriter> analysis_frame_writer_; |
160 std::unique_ptr<IvfFileWriter> encoded_frame_writer_; | 203 std::unique_ptr<IvfFileWriter> encoded_frame_writer_; |
161 std::unique_ptr<FrameWriter> decoded_frame_writer_; | 204 std::unique_ptr<FrameWriter> decoded_frame_writer_; |
162 PacketReader packet_reader_; | 205 PacketReader packet_reader_; |
163 std::unique_ptr<PacketManipulator> packet_manipulator_; | 206 std::unique_ptr<PacketManipulator> packet_manipulator_; |
164 Stats stats_; | 207 Stats stats_; |
165 std::unique_ptr<VideoProcessor> processor_; | 208 std::unique_ptr<VideoProcessor> processor_; |
166 | 209 |
167 // Quantities defined/updated for every encoder rate update. | 210 // Quantities updated for every encoded frame. |
168 int num_frames_per_update_[kMaxNumTemporalLayers]; | 211 TestResults actual_; |
169 float sum_frame_size_mismatch_[kMaxNumTemporalLayers]; | 212 |
170 float sum_encoded_frame_size_[kMaxNumTemporalLayers]; | 213 // Rates set for every encoder rate update. |
171 float encoding_bitrate_[kMaxNumTemporalLayers]; | 214 TargetRates target_; |
172 float per_frame_bandwidth_[kMaxNumTemporalLayers]; | |
173 float bitrate_layer_[kMaxNumTemporalLayers]; | |
174 float framerate_layer_[kMaxNumTemporalLayers]; | |
175 int num_frames_total_; | |
176 float sum_encoded_frame_size_total_; | |
177 float encoding_bitrate_total_; | |
178 float perc_encoding_rate_mismatch_; | |
179 int num_frames_to_hit_target_; | |
180 bool encoding_rate_within_target_; | |
181 int bitrate_kbps_; | |
182 int framerate_; | |
183 float target_size_key_frame_initial_; | |
184 float target_size_key_frame_; | |
185 float sum_key_frame_size_mismatch_; | |
186 int num_key_frames_; | |
187 }; | 215 }; |
188 | 216 |
189 } // namespace test | 217 } // namespace test |
190 } // namespace webrtc | 218 } // namespace webrtc |
191 | 219 |
192 #endif // MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H_ | 220 #endif // MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H_ |
OLD | NEW |