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 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 break; | 50 break; |
51 case kSSIM: | 51 case kSSIM: |
52 frame_result.value = I420SSIM(ref, test); | 52 frame_result.value = I420SSIM(ref, test); |
53 break; | 53 break; |
54 default: | 54 default: |
55 assert(false); | 55 assert(false); |
56 } | 56 } |
57 result->frames.push_back(frame_result); | 57 result->frames.push_back(frame_result); |
58 } | 58 } |
59 | 59 |
60 // Calculates average, min and max values for the supplied struct, if non-NULL. | 60 // Calculates average, min and max values for the supplied struct, if non-null. |
61 void CalculateStats(QualityMetricsResult* result) { | 61 void CalculateStats(QualityMetricsResult* result) { |
62 if (result == NULL || result->frames.size() == 0) { | 62 if (result == nullptr || result->frames.size() == 0) { |
63 return; | 63 return; |
64 } | 64 } |
65 // Calculate average. | 65 // Calculate average. |
66 std::vector<FrameResult>::iterator iter; | 66 std::vector<FrameResult>::iterator iter; |
67 double metrics_values_sum = 0.0; | 67 double metrics_values_sum = 0.0; |
68 for (iter = result->frames.begin(); iter != result->frames.end(); ++iter) { | 68 for (iter = result->frames.begin(); iter != result->frames.end(); ++iter) { |
69 metrics_values_sum += iter->value; | 69 metrics_values_sum += iter->value; |
70 } | 70 } |
71 result->average = metrics_values_sum / result->frames.size(); | 71 result->average = metrics_values_sum / result->frames.size(); |
72 | 72 |
73 // Calculate min/max statistics. | 73 // Calculate min/max statistics. |
74 iter = std::min_element(result->frames.begin(), result->frames.end(), | 74 iter = std::min_element(result->frames.begin(), result->frames.end(), |
75 LessForFrameResultValue); | 75 LessForFrameResultValue); |
76 result->min = iter->value; | 76 result->min = iter->value; |
77 result->min_frame_number = iter->frame_number; | 77 result->min_frame_number = iter->frame_number; |
78 iter = std::max_element(result->frames.begin(), result->frames.end(), | 78 iter = std::max_element(result->frames.begin(), result->frames.end(), |
79 LessForFrameResultValue); | 79 LessForFrameResultValue); |
80 result->max = iter->value; | 80 result->max = iter->value; |
81 result->max_frame_number = iter->frame_number; | 81 result->max_frame_number = iter->frame_number; |
82 } | 82 } |
83 | 83 |
84 // Single method that handles all combinations of video metrics calculation, to | 84 // Single method that handles all combinations of video metrics calculation, to |
85 // minimize code duplication. Either psnr_result or ssim_result may be NULL, | 85 // minimize code duplication. Either psnr_result or ssim_result may be null, |
86 // depending on which VideoMetricsType is targeted. | 86 // depending on which VideoMetricsType is targeted. |
87 int CalculateMetrics(VideoMetricsType video_metrics_type, | 87 int CalculateMetrics(VideoMetricsType video_metrics_type, |
88 const char* ref_filename, | 88 const char* ref_filename, |
89 const char* test_filename, | 89 const char* test_filename, |
90 int width, | 90 int width, |
91 int height, | 91 int height, |
92 QualityMetricsResult* psnr_result, | 92 QualityMetricsResult* psnr_result, |
93 QualityMetricsResult* ssim_result) { | 93 QualityMetricsResult* ssim_result) { |
94 assert(ref_filename != NULL); | 94 assert(ref_filename != nullptr); |
95 assert(test_filename != NULL); | 95 assert(test_filename != nullptr); |
96 assert(width > 0); | 96 assert(width > 0); |
97 assert(height > 0); | 97 assert(height > 0); |
98 | 98 |
99 FILE* ref_fp = fopen(ref_filename, "rb"); | 99 FILE* ref_fp = fopen(ref_filename, "rb"); |
100 if (ref_fp == NULL) { | 100 if (ref_fp == nullptr) { |
101 // Cannot open reference file. | 101 // Cannot open reference file. |
102 fprintf(stderr, "Cannot open file %s\n", ref_filename); | 102 fprintf(stderr, "Cannot open file %s\n", ref_filename); |
103 return -1; | 103 return -1; |
104 } | 104 } |
105 FILE* test_fp = fopen(test_filename, "rb"); | 105 FILE* test_fp = fopen(test_filename, "rb"); |
106 if (test_fp == NULL) { | 106 if (test_fp == nullptr) { |
107 // Cannot open test file. | 107 // Cannot open test file. |
108 fprintf(stderr, "Cannot open file %s\n", test_filename); | 108 fprintf(stderr, "Cannot open file %s\n", test_filename); |
109 fclose(ref_fp); | 109 fclose(ref_fp); |
110 return -2; | 110 return -2; |
111 } | 111 } |
112 int frame_number = 0; | 112 int frame_number = 0; |
113 | 113 |
114 // Read reference and test frames. | 114 // Read reference and test frames. |
115 for (;;) { | 115 for (;;) { |
116 rtc::scoped_refptr<I420Buffer> ref_i420_buffer( | 116 rtc::scoped_refptr<I420Buffer> ref_i420_buffer( |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 fclose(test_fp); | 156 fclose(test_fp); |
157 return return_code; | 157 return return_code; |
158 } | 158 } |
159 | 159 |
160 int I420MetricsFromFiles(const char* ref_filename, | 160 int I420MetricsFromFiles(const char* ref_filename, |
161 const char* test_filename, | 161 const char* test_filename, |
162 int width, | 162 int width, |
163 int height, | 163 int height, |
164 QualityMetricsResult* psnr_result, | 164 QualityMetricsResult* psnr_result, |
165 QualityMetricsResult* ssim_result) { | 165 QualityMetricsResult* ssim_result) { |
166 assert(psnr_result != NULL); | 166 assert(psnr_result != nullptr); |
167 assert(ssim_result != NULL); | 167 assert(ssim_result != nullptr); |
168 return CalculateMetrics(kBoth, ref_filename, test_filename, width, height, | 168 return CalculateMetrics(kBoth, ref_filename, test_filename, width, height, |
169 psnr_result, ssim_result); | 169 psnr_result, ssim_result); |
170 } | 170 } |
171 | 171 |
172 int I420PSNRFromFiles(const char* ref_filename, | 172 int I420PSNRFromFiles(const char* ref_filename, |
173 const char* test_filename, | 173 const char* test_filename, |
174 int width, | 174 int width, |
175 int height, | 175 int height, |
176 QualityMetricsResult* result) { | 176 QualityMetricsResult* result) { |
177 assert(result != NULL); | 177 assert(result != nullptr); |
178 return CalculateMetrics(kPSNR, ref_filename, test_filename, width, height, | 178 return CalculateMetrics(kPSNR, ref_filename, test_filename, width, height, |
179 result, NULL); | 179 result, nullptr); |
180 } | 180 } |
181 | 181 |
182 int I420SSIMFromFiles(const char* ref_filename, | 182 int I420SSIMFromFiles(const char* ref_filename, |
183 const char* test_filename, | 183 const char* test_filename, |
184 int width, | 184 int width, |
185 int height, | 185 int height, |
186 QualityMetricsResult* result) { | 186 QualityMetricsResult* result) { |
187 assert(result != NULL); | 187 assert(result != nullptr); |
188 return CalculateMetrics(kSSIM, ref_filename, test_filename, width, height, | 188 return CalculateMetrics(kSSIM, ref_filename, test_filename, width, height, |
189 NULL, result); | 189 nullptr, result); |
190 } | 190 } |
191 | 191 |
192 } // namespace test | 192 } // namespace test |
193 } // namespace webrtc | 193 } // namespace webrtc |
OLD | NEW |