OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 } | 66 } |
67 var = sse - ((sum * sum) >> 7); | 67 var = sse - ((sum * sum) >> 7); |
68 memset(dst, 0, 16 * 16); | 68 memset(dst, 0, 16 * 16); |
69 EXPECT_EQ(var, df_c->Variance16x8(src, 16, dst, 16, &sse)); | 69 EXPECT_EQ(var, df_c->Variance16x8(src, 16, dst, 16, &sse)); |
70 EXPECT_EQ(var, df_sse_neon->Variance16x8(src, 16, dst, 16, &sse)); | 70 EXPECT_EQ(var, df_sse_neon->Variance16x8(src, 16, dst, 16, &sse)); |
71 } | 71 } |
72 | 72 |
73 TEST_F(VideoProcessingTest, MbDenoise) { | 73 TEST_F(VideoProcessingTest, MbDenoise) { |
74 std::unique_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false)); | 74 std::unique_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false)); |
75 std::unique_ptr<DenoiserFilter> df_sse_neon(DenoiserFilter::Create(true)); | 75 std::unique_ptr<DenoiserFilter> df_sse_neon(DenoiserFilter::Create(true)); |
76 uint8_t running_src[16 * 16], src[16 * 16], dst[16 * 16], dst_ref[16 * 16]; | 76 uint8_t running_src[16 * 16], src[16 * 16]; |
| 77 uint8_t dst[16 * 16], dst_sse_neon[16 * 16]; |
77 | 78 |
78 // Test case: |diff| <= |3 + shift_inc1| | 79 // Test case: |diff| <= |3 + shift_inc1| |
79 for (int i = 0; i < 16; ++i) { | 80 for (int i = 0; i < 16; ++i) { |
80 for (int j = 0; j < 16; ++j) { | 81 for (int j = 0; j < 16; ++j) { |
81 running_src[i * 16 + j] = i * 11 + j; | 82 running_src[i * 16 + j] = i * 11 + j; |
82 src[i * 16 + j] = i * 11 + j + 2; | 83 src[i * 16 + j] = i * 11 + j + 2; |
83 dst_ref[i * 16 + j] = running_src[i * 16 + j]; | |
84 } | 84 } |
85 } | 85 } |
86 memset(dst, 0, 16 * 16); | 86 memset(dst, 0, 16 * 16); |
87 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | 87 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1, false); |
88 EXPECT_EQ(0, memcmp(dst, dst_ref, 16 * 16)); | 88 memset(dst_sse_neon, 0, 16 * 16); |
| 89 df_sse_neon->MbDenoise(running_src, 16, dst_sse_neon, 16, src, 16, 0, 1, |
| 90 false); |
| 91 EXPECT_EQ(0, memcmp(dst, dst_sse_neon, 16 * 16)); |
89 | 92 |
90 // Test case: |diff| >= |4 + shift_inc1| | 93 // Test case: |diff| >= |4 + shift_inc1| |
91 for (int i = 0; i < 16; ++i) { | 94 for (int i = 0; i < 16; ++i) { |
92 for (int j = 0; j < 16; ++j) { | 95 for (int j = 0; j < 16; ++j) { |
93 running_src[i * 16 + j] = i * 11 + j; | 96 running_src[i * 16 + j] = i * 11 + j; |
94 src[i * 16 + j] = i * 11 + j + 5; | 97 src[i * 16 + j] = i * 11 + j + 5; |
95 dst_ref[i * 16 + j] = src[i * 16 + j] - 2; | |
96 } | 98 } |
97 } | 99 } |
98 memset(dst, 0, 16 * 16); | 100 memset(dst, 0, 16 * 16); |
99 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | 101 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1, false); |
100 EXPECT_EQ(0, memcmp(dst, dst_ref, 16 * 16)); | 102 memset(dst_sse_neon, 0, 16 * 16); |
101 memset(dst, 0, 16 * 16); | 103 df_sse_neon->MbDenoise(running_src, 16, dst_sse_neon, 16, src, 16, 0, 1, |
102 df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | 104 false); |
103 EXPECT_EQ(0, memcmp(dst, dst_ref, 16 * 16)); | 105 EXPECT_EQ(0, memcmp(dst, dst_sse_neon, 16 * 16)); |
104 | 106 |
105 // Test case: |diff| >= 8 | 107 // Test case: |diff| >= 8 |
106 for (int i = 0; i < 16; ++i) { | 108 for (int i = 0; i < 16; ++i) { |
107 for (int j = 0; j < 16; ++j) { | 109 for (int j = 0; j < 16; ++j) { |
108 running_src[i * 16 + j] = i * 11 + j; | 110 running_src[i * 16 + j] = i * 11 + j; |
109 src[i * 16 + j] = i * 11 + j + 8; | 111 src[i * 16 + j] = i * 11 + j + 8; |
110 dst_ref[i * 16 + j] = src[i * 16 + j] - 6; | |
111 } | 112 } |
112 } | 113 } |
113 memset(dst, 0, 16 * 16); | 114 memset(dst, 0, 16 * 16); |
114 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | 115 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1, false); |
115 EXPECT_EQ(0, memcmp(dst, dst_ref, 16 * 16)); | 116 memset(dst_sse_neon, 0, 16 * 16); |
116 memset(dst, 0, 16 * 16); | 117 df_sse_neon->MbDenoise(running_src, 16, dst_sse_neon, 16, src, 16, 0, 1, |
117 df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | 118 false); |
118 EXPECT_EQ(0, memcmp(dst, dst_ref, 16 * 16)); | 119 EXPECT_EQ(0, memcmp(dst, dst_sse_neon, 16 * 16)); |
119 | 120 |
120 // Test case: |diff| > 15 | 121 // Test case: |diff| > 15 |
121 for (int i = 0; i < 16; ++i) { | 122 for (int i = 0; i < 16; ++i) { |
122 for (int j = 0; j < 16; ++j) { | 123 for (int j = 0; j < 16; ++j) { |
123 running_src[i * 16 + j] = i * 11 + j; | 124 running_src[i * 16 + j] = i * 11 + j; |
124 src[i * 16 + j] = i * 11 + j + 16; | 125 src[i * 16 + j] = i * 11 + j + 16; |
125 } | 126 } |
126 } | 127 } |
127 memset(dst, 0, 16 * 16); | 128 memset(dst, 0, 16 * 16); |
128 DenoiserDecision decision = | 129 DenoiserDecision decision = |
129 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | 130 df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1, false); |
130 EXPECT_EQ(COPY_BLOCK, decision); | 131 EXPECT_EQ(COPY_BLOCK, decision); |
131 decision = df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1); | 132 decision = |
| 133 df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1, false); |
132 EXPECT_EQ(COPY_BLOCK, decision); | 134 EXPECT_EQ(COPY_BLOCK, decision); |
133 } | 135 } |
134 | 136 |
135 TEST_F(VideoProcessingTest, Denoiser) { | 137 TEST_F(VideoProcessingTest, Denoiser) { |
136 // Create pure C denoiser. | 138 // Create pure C denoiser. |
137 VideoDenoiser denoiser_c(false); | 139 VideoDenoiser denoiser_c(false); |
138 // Create SSE or NEON denoiser. | 140 // Create SSE or NEON denoiser. |
139 VideoDenoiser denoiser_sse_neon(true); | 141 VideoDenoiser denoiser_sse_neon(true); |
140 VideoFrame denoised_frame_c; | 142 VideoFrame denoised_frame_c; |
| 143 VideoFrame denoised_frame_track_c; |
141 VideoFrame denoised_frame_sse_neon; | 144 VideoFrame denoised_frame_sse_neon; |
| 145 VideoFrame denoised_frame_track_sse_neon; |
142 | 146 |
143 std::unique_ptr<uint8_t[]> video_buffer(new uint8_t[frame_length_]); | 147 std::unique_ptr<uint8_t[]> video_buffer(new uint8_t[frame_length_]); |
144 while (fread(video_buffer.get(), 1, frame_length_, source_file_) == | 148 while (fread(video_buffer.get(), 1, frame_length_, source_file_) == |
145 frame_length_) { | 149 frame_length_) { |
146 // Using ConvertToI420 to add stride to the image. | 150 // Using ConvertToI420 to add stride to the image. |
147 EXPECT_EQ(0, ConvertToI420(kI420, video_buffer.get(), 0, 0, width_, height_, | 151 EXPECT_EQ(0, ConvertToI420(kI420, video_buffer.get(), 0, 0, width_, |
148 0, kVideoRotation_0, &video_frame_)); | 152 height_, 0, kVideoRotation_0, &video_frame_)); |
149 | 153 |
150 denoiser_c.DenoiseFrame(video_frame_, &denoised_frame_c); | 154 denoiser_c.DenoiseFrame(video_frame_, &denoised_frame_c, |
151 denoiser_sse_neon.DenoiseFrame(video_frame_, &denoised_frame_sse_neon); | 155 &denoised_frame_track_c); |
| 156 denoiser_sse_neon.DenoiseFrame(video_frame_, &denoised_frame_sse_neon, |
| 157 &denoised_frame_track_sse_neon); |
152 | 158 |
153 // Denoising results should be the same for C and SSE/NEON denoiser. | 159 // Denoising results should be the same for C and SSE/NEON denoiser. |
154 ASSERT_TRUE(test::FramesEqual(denoised_frame_c, denoised_frame_sse_neon)); | 160 ASSERT_TRUE(test::FramesEqual(denoised_frame_c, denoised_frame_sse_neon)); |
155 } | 161 } |
156 ASSERT_NE(0, feof(source_file_)) << "Error reading source file"; | 162 ASSERT_NE(0, feof(source_file_)) << "Error reading source file"; |
157 } | 163 } |
158 | 164 |
159 } // namespace webrtc | 165 } // namespace webrtc |
OLD | NEW |