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

Side by Side Diff: source/libvpx/vp9/encoder/vp9_denoiser.c

Issue 1302353004: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 3 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_denoiser.h ('k') | source/libvpx/vp9/encoder/vp9_encodeframe.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebM 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 static int sse_diff_thresh(BLOCK_SIZE bs, int increase_denoising, 56 static int sse_diff_thresh(BLOCK_SIZE bs, int increase_denoising,
57 int motion_magnitude) { 57 int motion_magnitude) {
58 if (motion_magnitude > 58 if (motion_magnitude >
59 noise_motion_thresh(bs, increase_denoising)) { 59 noise_motion_thresh(bs, increase_denoising)) {
60 return 0; 60 return 0;
61 } else { 61 } else {
62 return (1 << num_pels_log2_lookup[bs]) * 20; 62 return (1 << num_pels_log2_lookup[bs]) * 20;
63 } 63 }
64 } 64 }
65 65
66 int total_adj_strong_thresh(BLOCK_SIZE bs, int increase_denoising) {
67 return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 3 : 2);
68 }
69
70 static int total_adj_weak_thresh(BLOCK_SIZE bs, int increase_denoising) { 66 static int total_adj_weak_thresh(BLOCK_SIZE bs, int increase_denoising) {
71 return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 3 : 2); 67 return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 3 : 2);
72 } 68 }
73 69
74 // TODO(jackychen): If increase_denoising is enabled in the future, 70 // TODO(jackychen): If increase_denoising is enabled in the future,
75 // we might need to update the code for calculating 'total_adj' in 71 // we might need to update the code for calculating 'total_adj' in
76 // case the C code is not bit-exact with corresponding sse2 code. 72 // case the C code is not bit-exact with corresponding sse2 code.
77 int vp9_denoiser_filter_c(const uint8_t *sig, int sig_stride, 73 int vp9_denoiser_filter_c(const uint8_t *sig, int sig_stride,
78 const uint8_t *mc_avg, 74 const uint8_t *mc_avg,
79 int mc_avg_stride, 75 int mc_avg_stride,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 adj = adj_val[0]; 113 adj = adj_val[0];
118 break; 114 break;
119 case 8: case 9: case 10: case 11: 115 case 8: case 9: case 10: case 11:
120 case 12: case 13: case 14: case 15: 116 case 12: case 13: case 14: case 15:
121 adj = adj_val[1]; 117 adj = adj_val[1];
122 break; 118 break;
123 default: 119 default:
124 adj = adj_val[2]; 120 adj = adj_val[2];
125 } 121 }
126 if (diff > 0) { 122 if (diff > 0) {
127 avg[c] = MIN(UINT8_MAX, sig[c] + adj); 123 avg[c] = VPXMIN(UINT8_MAX, sig[c] + adj);
128 total_adj += adj; 124 total_adj += adj;
129 } else { 125 } else {
130 avg[c] = MAX(0, sig[c] - adj); 126 avg[c] = VPXMAX(0, sig[c] - adj);
131 total_adj -= adj; 127 total_adj -= adj;
132 } 128 }
133 } 129 }
134 } 130 }
135 sig += sig_stride; 131 sig += sig_stride;
136 avg += avg_stride; 132 avg += avg_stride;
137 mc_avg += mc_avg_stride; 133 mc_avg += mc_avg_stride;
138 } 134 }
139 135
140 // If the strong filter did not modify the signal too much, we're all set. 136 // If the strong filter did not modify the signal too much, we're all set.
(...skipping 16 matching lines...) Expand all
157 for (c = 0; c < (4 << b_width_log2_lookup[bs]); ++c) { 153 for (c = 0; c < (4 << b_width_log2_lookup[bs]); ++c) {
158 diff = mc_avg[c] - sig[c]; 154 diff = mc_avg[c] - sig[c];
159 adj = abs(diff); 155 adj = abs(diff);
160 if (adj > delta) { 156 if (adj > delta) {
161 adj = delta; 157 adj = delta;
162 } 158 }
163 if (diff > 0) { 159 if (diff > 0) {
164 // Diff positive means we made positive adjustment above 160 // Diff positive means we made positive adjustment above
165 // (in first try/attempt), so now make negative adjustment to bring 161 // (in first try/attempt), so now make negative adjustment to bring
166 // denoised signal down. 162 // denoised signal down.
167 avg[c] = MAX(0, avg[c] - adj); 163 avg[c] = VPXMAX(0, avg[c] - adj);
168 total_adj -= adj; 164 total_adj -= adj;
169 } else { 165 } else {
170 // Diff negative means we made negative adjustment above 166 // Diff negative means we made negative adjustment above
171 // (in first try/attempt), so now make positive adjustment to bring 167 // (in first try/attempt), so now make positive adjustment to bring
172 // denoised signal up. 168 // denoised signal up.
173 avg[c] = MIN(UINT8_MAX, avg[c] + adj); 169 avg[c] = VPXMIN(UINT8_MAX, avg[c] + adj);
174 total_adj += adj; 170 total_adj += adj;
175 } 171 }
176 } 172 }
177 sig += sig_stride; 173 sig += sig_stride;
178 avg += avg_stride; 174 avg += avg_stride;
179 mc_avg += mc_avg_stride; 175 mc_avg += mc_avg_stride;
180 } 176 }
181 177
182 // We can use the filter if it has been sufficiently dampened 178 // We can use the filter if it has been sufficiently dampened
183 if (abs(total_adj) <= total_adj_weak_thresh(bs, increase_denoising)) { 179 if (abs(total_adj) <= total_adj_weak_thresh(bs, increase_denoising)) {
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 int ssx, int ssy, 424 int ssx, int ssy,
429 #if CONFIG_VP9_HIGHBITDEPTH 425 #if CONFIG_VP9_HIGHBITDEPTH
430 int use_highbitdepth, 426 int use_highbitdepth,
431 #endif 427 #endif
432 int border) { 428 int border) {
433 int i, fail; 429 int i, fail;
434 const int legacy_byte_alignment = 0; 430 const int legacy_byte_alignment = 0;
435 assert(denoiser != NULL); 431 assert(denoiser != NULL);
436 432
437 for (i = 0; i < MAX_REF_FRAMES; ++i) { 433 for (i = 0; i < MAX_REF_FRAMES; ++i) {
438 fail = vp9_alloc_frame_buffer(&denoiser->running_avg_y[i], width, height, 434 fail = vpx_alloc_frame_buffer(&denoiser->running_avg_y[i], width, height,
439 ssx, ssy, 435 ssx, ssy,
440 #if CONFIG_VP9_HIGHBITDEPTH 436 #if CONFIG_VP9_HIGHBITDEPTH
441 use_highbitdepth, 437 use_highbitdepth,
442 #endif 438 #endif
443 border, legacy_byte_alignment); 439 border, legacy_byte_alignment);
444 if (fail) { 440 if (fail) {
445 vp9_denoiser_free(denoiser); 441 vp9_denoiser_free(denoiser);
446 return 1; 442 return 1;
447 } 443 }
448 #ifdef OUTPUT_YUV_DENOISED 444 #ifdef OUTPUT_YUV_DENOISED
449 make_grayscale(&denoiser->running_avg_y[i]); 445 make_grayscale(&denoiser->running_avg_y[i]);
450 #endif 446 #endif
451 } 447 }
452 448
453 fail = vp9_alloc_frame_buffer(&denoiser->mc_running_avg_y, width, height, 449 fail = vpx_alloc_frame_buffer(&denoiser->mc_running_avg_y, width, height,
454 ssx, ssy, 450 ssx, ssy,
455 #if CONFIG_VP9_HIGHBITDEPTH 451 #if CONFIG_VP9_HIGHBITDEPTH
456 use_highbitdepth, 452 use_highbitdepth,
457 #endif 453 #endif
458 border, legacy_byte_alignment); 454 border, legacy_byte_alignment);
459 if (fail) { 455 if (fail) {
460 vp9_denoiser_free(denoiser); 456 vp9_denoiser_free(denoiser);
461 return 1; 457 return 1;
462 } 458 }
463 #ifdef OUTPUT_YUV_DENOISED 459 #ifdef OUTPUT_YUV_DENOISED
464 make_grayscale(&denoiser->running_avg_y[i]); 460 make_grayscale(&denoiser->running_avg_y[i]);
465 #endif 461 #endif
466 denoiser->increase_denoising = 0; 462 denoiser->increase_denoising = 0;
467 denoiser->frame_buffer_initialized = 1; 463 denoiser->frame_buffer_initialized = 1;
468 464
469 return 0; 465 return 0;
470 } 466 }
471 467
472 void vp9_denoiser_free(VP9_DENOISER *denoiser) { 468 void vp9_denoiser_free(VP9_DENOISER *denoiser) {
473 int i; 469 int i;
474 denoiser->frame_buffer_initialized = 0; 470 denoiser->frame_buffer_initialized = 0;
475 if (denoiser == NULL) { 471 if (denoiser == NULL) {
476 return; 472 return;
477 } 473 }
478 for (i = 0; i < MAX_REF_FRAMES; ++i) { 474 for (i = 0; i < MAX_REF_FRAMES; ++i) {
479 vp9_free_frame_buffer(&denoiser->running_avg_y[i]); 475 vpx_free_frame_buffer(&denoiser->running_avg_y[i]);
480 } 476 }
481 vp9_free_frame_buffer(&denoiser->mc_running_avg_y); 477 vpx_free_frame_buffer(&denoiser->mc_running_avg_y);
482 } 478 }
483 479
484 #ifdef OUTPUT_YUV_DENOISED 480 #ifdef OUTPUT_YUV_DENOISED
485 static void make_grayscale(YV12_BUFFER_CONFIG *yuv) { 481 static void make_grayscale(YV12_BUFFER_CONFIG *yuv) {
486 int r, c; 482 int r, c;
487 uint8_t *u = yuv->u_buffer; 483 uint8_t *u = yuv->u_buffer;
488 uint8_t *v = yuv->v_buffer; 484 uint8_t *v = yuv->v_buffer;
489 485
490 for (r = 0; r < yuv->uv_height; ++r) { 486 for (r = 0; r < yuv->uv_height; ++r) {
491 for (c = 0; c < yuv->uv_width; ++c) { 487 for (c = 0; c < yuv->uv_width; ++c) {
492 u[c] = UINT8_MAX / 2; 488 u[c] = UINT8_MAX / 2;
493 v[c] = UINT8_MAX / 2; 489 v[c] = UINT8_MAX / 2;
494 } 490 }
495 u += yuv->uv_stride; 491 u += yuv->uv_stride;
496 v += yuv->uv_stride; 492 v += yuv->uv_stride;
497 } 493 }
498 } 494 }
499 #endif 495 #endif
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_denoiser.h ('k') | source/libvpx/vp9/encoder/vp9_encodeframe.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698