Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Side by Side Diff: webrtc/modules/video_processing/test/denoiser_test.cc

Issue 1822333003: External denoiser based on noise estimation and moving object detection. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698