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 16 matching lines...) Expand all Loading... |
27 | 27 |
28 // Define command line flag 'gen_files' (default value: false). | 28 // Define command line flag 'gen_files' (default value: false). |
29 DEFINE_bool(gen_files, false, "Output files for visual inspection."); | 29 DEFINE_bool(gen_files, false, "Output files for visual inspection."); |
30 | 30 |
31 } // namespace | 31 } // namespace |
32 | 32 |
33 static void PreprocessFrameAndVerify(const VideoFrame& source, | 33 static void PreprocessFrameAndVerify(const VideoFrame& source, |
34 int target_width, | 34 int target_width, |
35 int target_height, | 35 int target_height, |
36 VideoProcessing* vpm, | 36 VideoProcessing* vpm, |
37 const VideoFrame* out_frame); | 37 const VideoFrame** out_frame); |
38 static rtc::scoped_refptr<VideoFrameBuffer> CropBuffer( | 38 static rtc::scoped_refptr<VideoFrameBuffer> CropBuffer( |
39 rtc::scoped_refptr<VideoFrameBuffer> source_buffer, | 39 rtc::scoped_refptr<VideoFrameBuffer> source_buffer, |
40 int offset_x, | 40 int offset_x, |
41 int offset_y, | 41 int offset_y, |
42 int cropped_width, | 42 int cropped_width, |
43 int cropped_height); | 43 int cropped_height); |
44 // The |source_data| is cropped and scaled to |target_width| x |target_height|, | 44 // The |source_data| is cropped and scaled to |target_width| x |target_height|, |
45 // and then scaled back to the expected cropped size. |expected_psnr| is used to | 45 // and then scaled back to the expected cropped size. |expected_psnr| is used to |
46 // verify basic quality, and is set to be ~0.1/0.05dB lower than actual PSNR | 46 // verify basic quality, and is set to be ~0.1/0.05dB lower than actual PSNR |
47 // verified under the same conditions. | 47 // verified under the same conditions. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 TEST_F(VideoProcessingTest, PreprocessorLogic) { | 91 TEST_F(VideoProcessingTest, PreprocessorLogic) { |
92 #endif | 92 #endif |
93 // Disable temporal sampling (frame dropping). | 93 // Disable temporal sampling (frame dropping). |
94 vp_->EnableTemporalDecimation(false); | 94 vp_->EnableTemporalDecimation(false); |
95 int resolution = 100; | 95 int resolution = 100; |
96 EXPECT_EQ(VPM_OK, vp_->SetTargetResolution(resolution, resolution, 15)); | 96 EXPECT_EQ(VPM_OK, vp_->SetTargetResolution(resolution, resolution, 15)); |
97 EXPECT_EQ(VPM_OK, vp_->SetTargetResolution(resolution, resolution, 30)); | 97 EXPECT_EQ(VPM_OK, vp_->SetTargetResolution(resolution, resolution, 30)); |
98 // Disable spatial sampling. | 98 // Disable spatial sampling. |
99 vp_->SetInputFrameResampleMode(kNoRescaling); | 99 vp_->SetInputFrameResampleMode(kNoRescaling); |
100 EXPECT_EQ(VPM_OK, vp_->SetTargetResolution(resolution, resolution, 30)); | 100 EXPECT_EQ(VPM_OK, vp_->SetTargetResolution(resolution, resolution, 30)); |
101 VideoFrame* out_frame = NULL; | 101 const VideoFrame* out_frame = NULL; |
102 // Set rescaling => output frame != NULL. | 102 // Set rescaling => output frame != NULL. |
103 vp_->SetInputFrameResampleMode(kFastRescaling); | 103 vp_->SetInputFrameResampleMode(kFastRescaling); |
104 | 104 |
105 rtc::scoped_refptr<webrtc::I420Buffer> buffer = | 105 rtc::scoped_refptr<webrtc::I420Buffer> buffer = |
106 I420Buffer::Create(width_, height_, width_, half_width_, half_width_); | 106 I420Buffer::Create(width_, height_, width_, half_width_, half_width_); |
107 | 107 |
108 // Clear video frame so DrMemory/Valgrind will allow reads of the buffer. | 108 // Clear video frame so DrMemory/Valgrind will allow reads of the buffer. |
109 buffer->InitializeData(); | 109 buffer->InitializeData(); |
110 VideoFrame video_frame(buffer, 0, 0, webrtc::kVideoRotation_0); | 110 VideoFrame video_frame(buffer, 0, 0, webrtc::kVideoRotation_0); |
111 | 111 |
112 PreprocessFrameAndVerify(video_frame, resolution, resolution, vp_, out_frame); | 112 PreprocessFrameAndVerify(video_frame, resolution, resolution, vp_, |
| 113 &out_frame); |
113 // No rescaling=> output frame = NULL. | 114 // No rescaling=> output frame = NULL. |
114 vp_->SetInputFrameResampleMode(kNoRescaling); | 115 vp_->SetInputFrameResampleMode(kNoRescaling); |
115 EXPECT_TRUE(vp_->PreprocessFrame(video_frame) != nullptr); | 116 EXPECT_TRUE(vp_->PreprocessFrame(video_frame) != nullptr); |
116 } | 117 } |
117 | 118 |
118 #if defined(WEBRTC_IOS) | 119 #if defined(WEBRTC_IOS) |
119 TEST_F(VideoProcessingTest, DISABLED_Resampler) { | 120 TEST_F(VideoProcessingTest, DISABLED_Resampler) { |
120 #else | 121 #else |
121 TEST_F(VideoProcessingTest, Resampler) { | 122 TEST_F(VideoProcessingTest, Resampler) { |
122 #endif | 123 #endif |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 | 186 |
186 printf("\nAverage run time = %d us / frame\n", | 187 printf("\nAverage run time = %d us / frame\n", |
187 static_cast<int>(total_runtime)); | 188 static_cast<int>(total_runtime)); |
188 printf("Min run time = %d us / frame\n\n", static_cast<int>(min_runtime)); | 189 printf("Min run time = %d us / frame\n\n", static_cast<int>(min_runtime)); |
189 } | 190 } |
190 | 191 |
191 void PreprocessFrameAndVerify(const VideoFrame& source, | 192 void PreprocessFrameAndVerify(const VideoFrame& source, |
192 int target_width, | 193 int target_width, |
193 int target_height, | 194 int target_height, |
194 VideoProcessing* vpm, | 195 VideoProcessing* vpm, |
195 const VideoFrame* out_frame) { | 196 const VideoFrame** out_frame) { |
196 ASSERT_EQ(VPM_OK, vpm->SetTargetResolution(target_width, target_height, 30)); | 197 ASSERT_EQ(VPM_OK, vpm->SetTargetResolution(target_width, target_height, 30)); |
197 out_frame = vpm->PreprocessFrame(source); | 198 *out_frame = vpm->PreprocessFrame(source); |
198 EXPECT_TRUE(out_frame != nullptr); | 199 EXPECT_TRUE(*out_frame != nullptr); |
199 | 200 |
200 // If no resizing is needed, expect the original frame. | 201 // If no resizing is needed, expect the original frame. |
201 if (target_width == source.width() && target_height == source.height()) { | 202 if (target_width == source.width() && target_height == source.height()) { |
202 EXPECT_EQ(&source, out_frame); | 203 EXPECT_EQ(&source, *out_frame); |
203 return; | 204 return; |
204 } | 205 } |
205 | 206 |
206 // Verify the resampled frame. | 207 // Verify the resampled frame. |
207 EXPECT_TRUE(out_frame != NULL); | 208 EXPECT_EQ(source.render_time_ms(), (*out_frame)->render_time_ms()); |
208 EXPECT_EQ(source.render_time_ms(), (out_frame)->render_time_ms()); | 209 EXPECT_EQ(source.timestamp(), (*out_frame)->timestamp()); |
209 EXPECT_EQ(source.timestamp(), (out_frame)->timestamp()); | 210 EXPECT_EQ(target_width, (*out_frame)->width()); |
210 EXPECT_EQ(target_width, (out_frame)->width()); | 211 EXPECT_EQ(target_height, (*out_frame)->height()); |
211 EXPECT_EQ(target_height, (out_frame)->height()); | |
212 } | 212 } |
213 | 213 |
214 rtc::scoped_refptr<VideoFrameBuffer> CropBuffer( | 214 rtc::scoped_refptr<VideoFrameBuffer> CropBuffer( |
215 rtc::scoped_refptr<VideoFrameBuffer> source_buffer, | 215 rtc::scoped_refptr<VideoFrameBuffer> source_buffer, |
216 int offset_x, | 216 int offset_x, |
217 int offset_y, | 217 int offset_y, |
218 int cropped_width, | 218 int cropped_width, |
219 int cropped_height) { | 219 int cropped_height) { |
220 // Force even. | 220 // Force even. |
221 offset_x &= ~1; | 221 offset_x &= ~1; |
(...skipping 11 matching lines...) Expand all Loading... |
233 source_buffer->StrideV(), rtc::KeepRefUntilDone(source_buffer))); | 233 source_buffer->StrideV(), rtc::KeepRefUntilDone(source_buffer))); |
234 } | 234 } |
235 | 235 |
236 void TestSize(const VideoFrame& source_frame, | 236 void TestSize(const VideoFrame& source_frame, |
237 const VideoFrameBuffer& cropped_source, | 237 const VideoFrameBuffer& cropped_source, |
238 int target_width, | 238 int target_width, |
239 int target_height, | 239 int target_height, |
240 double expected_psnr, | 240 double expected_psnr, |
241 VideoProcessing* vpm) { | 241 VideoProcessing* vpm) { |
242 // Resample source_frame to out_frame. | 242 // Resample source_frame to out_frame. |
243 VideoFrame* out_frame = NULL; | 243 const VideoFrame* out_frame = NULL; |
244 vpm->SetInputFrameResampleMode(kBox); | 244 vpm->SetInputFrameResampleMode(kBox); |
245 PreprocessFrameAndVerify(source_frame, target_width, target_height, vpm, | 245 PreprocessFrameAndVerify(source_frame, target_width, target_height, vpm, |
246 out_frame); | 246 &out_frame); |
247 if (out_frame == NULL) | 247 if (out_frame == NULL) |
248 return; | 248 return; |
249 WriteProcessedFrameForVisualInspection(source_frame, *out_frame); | 249 WriteProcessedFrameForVisualInspection(source_frame, *out_frame); |
250 | 250 |
251 // Scale |resampled_source_frame| back to the source scale. | 251 // Scale |resampled_source_frame| back to the source scale. |
252 VideoFrame resampled_source_frame; | 252 VideoFrame resampled_source_frame; |
253 resampled_source_frame.ShallowCopy(*out_frame); | 253 resampled_source_frame.ShallowCopy(*out_frame); |
254 // Compute PSNR against the cropped source frame and check expectation. | 254 // Compute PSNR against the cropped source frame and check expectation. |
255 PreprocessFrameAndVerify(resampled_source_frame, | 255 PreprocessFrameAndVerify(resampled_source_frame, |
256 cropped_source.width(), | 256 cropped_source.width(), |
257 cropped_source.height(), vpm, out_frame); | 257 cropped_source.height(), vpm, &out_frame); |
258 WriteProcessedFrameForVisualInspection(resampled_source_frame, *out_frame); | 258 WriteProcessedFrameForVisualInspection(resampled_source_frame, *out_frame); |
259 | 259 |
260 // Compute PSNR against the cropped source frame and check expectation. | 260 // Compute PSNR against the cropped source frame and check expectation. |
261 double psnr = | 261 double psnr = |
262 I420PSNR(cropped_source, *out_frame->video_frame_buffer()); | 262 I420PSNR(cropped_source, *out_frame->video_frame_buffer()); |
263 EXPECT_GT(psnr, expected_psnr); | 263 EXPECT_GT(psnr, expected_psnr); |
264 printf( | 264 printf( |
265 "PSNR: %f. PSNR is between source of size %d %d, and a modified " | 265 "PSNR: %f. PSNR is between source of size %d %d, and a modified " |
266 "source which is scaled down/up to: %d %d, and back to source size \n", | 266 "source which is scaled down/up to: %d %d, and back to source size \n", |
267 psnr, source_frame.width(), source_frame.height(), target_width, | 267 psnr, source_frame.width(), source_frame.height(), target_width, |
(...skipping 13 matching lines...) Expand all Loading... |
281 std::cout << "Watch " << filename.str() << " and verify that it is okay." | 281 std::cout << "Watch " << filename.str() << " and verify that it is okay." |
282 << std::endl; | 282 << std::endl; |
283 FILE* stand_alone_file = fopen(filename.str().c_str(), "wb"); | 283 FILE* stand_alone_file = fopen(filename.str().c_str(), "wb"); |
284 if (PrintVideoFrame(processed, stand_alone_file) < 0) | 284 if (PrintVideoFrame(processed, stand_alone_file) < 0) |
285 std::cerr << "Failed to write: " << filename.str() << std::endl; | 285 std::cerr << "Failed to write: " << filename.str() << std::endl; |
286 if (stand_alone_file) | 286 if (stand_alone_file) |
287 fclose(stand_alone_file); | 287 fclose(stand_alone_file); |
288 } | 288 } |
289 | 289 |
290 } // namespace webrtc | 290 } // namespace webrtc |
OLD | NEW |