OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | |
3 * | |
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 | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include <string.h> | |
12 | |
13 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | |
14 #include "webrtc/modules/video_processing/include/video_processing.h" | |
15 #include "webrtc/modules/video_processing/test/video_processing_unittest.h" | |
16 #include "webrtc/modules/video_processing/video_denoiser.h" | |
17 #include "webrtc/test/testsupport/gtest_disable.h" | |
18 | |
19 namespace webrtc { | |
20 | |
21 TEST_F(VideoProcessingTest, CopyMem) { | |
22 rtc::scoped_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false)); | |
23 rtc::scoped_ptr<DenoiserFilter> df_sse_neon(DenoiserFilter::Create(true)); | |
24 uint8_t src[16*16], dst[16*16]; | |
25 for (int i = 0; i < 16; ++i) { | |
26 for (int j = 0; j < 16; ++j) { | |
27 src[i*16 + j] = i*16 + j; | |
28 } | |
29 } | |
30 | |
31 memset(dst, 0, 8*8); | |
32 df_c->CopyMem8x8(src, 8, dst, 8); | |
33 EXPECT_EQ(0, memcmp(src, dst, 8*8)); | |
34 | |
35 memset(dst, 0, 16*16); | |
36 df_c->CopyMem16x16(src, 16, dst, 16); | |
37 EXPECT_EQ(0, memcmp(src, dst, 16*16)); | |
38 | |
39 memset(dst, 0, 8*8); | |
40 df_sse_neon->CopyMem16x16(src, 8, dst, 8); | |
41 EXPECT_EQ(0, memcmp(src, dst, 8*8)); | |
42 | |
43 memset(dst, 0, 16*16); | |
44 df_sse_neon->CopyMem16x16(src, 16, dst, 16); | |
45 EXPECT_EQ(0, memcmp(src, dst, 16*16)); | |
46 } | |
47 | |
48 TEST_F(VideoProcessingTest, Variance) { | |
49 rtc::scoped_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false)); | |
50 rtc::scoped_ptr<DenoiserFilter> df_sse_neon(DenoiserFilter::Create(true)); | |
51 uint8_t src[16*16], dst[16*16]; | |
52 uint32_t sse = 0; | |
53 for (int i = 0; i < 16; ++i) { | |
54 for (int j = 0; j < 16; ++j) { | |
55 src[i*16 + j] = i*16 + j; | |
56 } | |
57 } | |
58 memset(dst, 0, 16*16); | |
59 EXPECT_EQ(690848, (int)df_c->Variance16x8(src, 16, dst, 16, &sse)); | |
60 EXPECT_EQ(690848, (int)df_sse_neon->Variance16x8(src, 16, dst, 16, &sse)); | |
stefan-webrtc
2015/12/17 10:07:47
static_cast<int>, or 690848u.
Could you maybe eve
jackychen
2015/12/18 07:32:01
Done.
| |
61 } | |
62 | |
63 TEST_F(VideoProcessingTest, MbDenoise) { | |
64 rtc::scoped_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false)); | |
65 rtc::scoped_ptr<DenoiserFilter> df_sse_neon(DenoiserFilter::Create(true)); | |
66 uint8_t running_src[16*16], src[16*16], dst[16*16], dst_ref[16*16]; | |
67 | |
68 // Test case: |diff| <= |3 + shift_inc1| | |
69 for (int i = 0; i < 16; ++i) { | |
70 for (int j = 0; j < 16; ++j) { | |
71 running_src[i*16 + j] = i*11 + j; | |
72 src[i*16 + j] = i*11 + j + 2; | |
73 dst_ref[i*16 + j] = running_src[i*16 + j]; | |
74 } | |
75 } | |
76 memset(dst, 0, 16*16); | |
77 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | |
78 EXPECT_EQ(0, memcmp(dst, dst_ref, 16*16)); | |
79 | |
80 // Test case: |diff| >= |4 + shift_inc1| | |
81 for (int i = 0; i < 16; ++i) { | |
82 for (int j = 0; j < 16; ++j) { | |
83 running_src[i*16 + j] = i*11 + j; | |
84 src[i*16 + j] = i*11 + j + 5; | |
85 dst_ref[i*16 + j] = src[i*16 + j] - 2; | |
86 } | |
87 } | |
88 memset(dst, 0, 16*16); | |
89 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | |
90 EXPECT_EQ(0, memcmp(dst, dst_ref, 16*16)); | |
91 memset(dst, 0, 16*16); | |
92 df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | |
93 EXPECT_EQ(0, memcmp(dst, dst_ref, 16*16)); | |
94 | |
95 // Test case: |diff| >= 8 | |
96 for (int i = 0; i < 16; ++i) { | |
97 for (int j = 0; j < 16; ++j) { | |
98 running_src[i*16 + j] = i*11 + j; | |
99 src[i*16 + j] = i*11 + j + 8; | |
100 dst_ref[i*16 + j] = src[i*16 + j] - 6; | |
101 } | |
102 } | |
103 memset(dst, 0, 16*16); | |
104 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | |
105 EXPECT_EQ(0, memcmp(dst, dst_ref, 16*16)); | |
106 memset(dst, 0, 16*16); | |
107 df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | |
108 EXPECT_EQ(0, memcmp(dst, dst_ref, 16*16)); | |
109 | |
110 // Test case: |diff| > 15 | |
111 for (int i = 0; i < 16; ++i) { | |
112 for (int j = 0; j < 16; ++j) { | |
113 running_src[i*16 + j] = i*11 + j; | |
114 src[i*16 + j] = i*11 + j + 16; | |
115 } | |
116 } | |
117 memset(dst, 0, 16*16); | |
118 DenoiserDecision decision = | |
119 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | |
120 EXPECT_EQ(COPY_BLOCK, decision); | |
121 decision = df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | |
122 EXPECT_EQ(COPY_BLOCK, decision); | |
123 } | |
124 | |
125 TEST_F(VideoProcessingTest, Denoiser) { | |
126 // Create pure C denoiser. | |
127 VideoDenoiser denoiser_c(false); | |
128 // Create SSE or NEON denoiser. | |
129 VideoDenoiser denoiser_sse_neon(true); | |
130 VideoFrame denoised_frame_c; | |
131 VideoFrame denoised_frame_sse_neon; | |
132 | |
133 rtc::scoped_ptr<uint8_t[]> video_buffer(new uint8_t[frame_length_]); | |
134 while (fread(video_buffer.get(), 1, frame_length_, source_file_) == | |
135 frame_length_) { | |
136 // Using ConvertToI420 to add stride to the image. | |
137 EXPECT_EQ(0, ConvertToI420(kI420, video_buffer.get(), 0, 0, width_, height_, | |
138 0, kVideoRotation_0, &video_frame_)); | |
139 | |
140 denoiser_c.DenoiseFrame(video_frame_, &denoised_frame_c); | |
141 denoiser_sse_neon.DenoiseFrame(video_frame_, &denoised_frame_sse_neon); | |
142 | |
143 // Denoising results should be the same for C and SSE/NEON denoiser. | |
144 ASSERT_EQ(true, denoised_frame_c.EqualFrames(denoised_frame_sse_neon)); | |
145 } | |
146 ASSERT_NE(0, feof(source_file_)) << "Error reading source file"; | |
147 } | |
148 | |
149 } // namespace webrtc | |
OLD | NEW |