OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 |
11 #include "webrtc/modules/video_processing/util/noise_estimation.h" | 11 #include "webrtc/modules/video_processing/util/noise_estimation.h" |
| 12 #if DISPLAY |
| 13 #include <android/log.h> |
| 14 #endif |
12 | 15 |
13 namespace webrtc { | 16 namespace webrtc { |
14 | 17 |
15 void NoiseEstimation::Init(int width, int height, CpuType cpu_type) { | 18 void NoiseEstimation::Init(int width, int height, CpuType cpu_type) { |
16 int mb_cols = width >> 4; | 19 int mb_cols = width >> 4; |
17 int mb_rows = height >> 4; | 20 int mb_rows = height >> 4; |
18 consec_low_var_.reset(new uint32_t[mb_cols * mb_rows]()); | 21 consec_low_var_.reset(new uint32_t[mb_cols * mb_rows]()); |
19 width_ = width; | 22 width_ = width; |
20 height_ = height; | 23 height_ = height; |
21 mb_cols_ = width_ >> 4; | 24 mb_cols_ = width_ >> 4; |
(...skipping 21 matching lines...) Expand all Loading... |
43 | 46 |
44 void NoiseEstimation::UpdateNoiseLevel() { | 47 void NoiseEstimation::UpdateNoiseLevel() { |
45 // TODO(jackychen): Tune a threshold for numb_noisy_block > T to make the | 48 // TODO(jackychen): Tune a threshold for numb_noisy_block > T to make the |
46 // condition more reasonable. | 49 // condition more reasonable. |
47 // No enough samples implies the motion of the camera or too many moving | 50 // No enough samples implies the motion of the camera or too many moving |
48 // objects in the frame. | 51 // objects in the frame. |
49 if (num_static_block_ < | 52 if (num_static_block_ < |
50 (0.65 * mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL) || | 53 (0.65 * mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL) || |
51 !num_noisy_block_) { | 54 !num_noisy_block_) { |
52 #if DISPLAY | 55 #if DISPLAY |
53 printf("Not enough samples. %d \n", num_static_block_); | 56 if (cpu_type_) { |
| 57 printf("Not enough samples. %d \n", num_static_block_); |
| 58 } else { |
| 59 __android_log_print(ANDROID_LOG_DEBUG, "DISPLAY", |
| 60 "Not enough samples. %d \n", num_static_block_); |
| 61 } |
54 #endif | 62 #endif |
55 noise_var_ = 0; | 63 noise_var_ = 0; |
56 noise_var_accum_ = 0; | 64 noise_var_accum_ = 0; |
57 num_noisy_block_ = 0; | 65 num_noisy_block_ = 0; |
58 num_static_block_ = 0; | 66 num_static_block_ = 0; |
59 return; | 67 return; |
60 } else { | 68 } else { |
61 #if DISPLAY | 69 #if DISPLAY |
62 printf("%d %d fraction = %.3f\n", num_static_block_, | 70 if (cpu_type_) { |
63 mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL, | 71 printf("%d %d fraction = %.3f\n", num_static_block_, |
64 percent_static_block_); | 72 mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL, |
| 73 percent_static_block_); |
| 74 } else { |
| 75 __android_log_print(ANDROID_LOG_DEBUG, "DISPLAY", |
| 76 "%d %d fraction = %.3f\n", num_static_block_, |
| 77 mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL, |
| 78 percent_static_block_); |
| 79 } |
65 #endif | 80 #endif |
66 // Normalized by the number of noisy blocks. | 81 // Normalized by the number of noisy blocks. |
67 noise_var_ /= num_noisy_block_; | 82 noise_var_ /= num_noisy_block_; |
68 // Get the percentage of static blocks. | 83 // Get the percentage of static blocks. |
69 percent_static_block_ = static_cast<double>(num_static_block_) / | 84 percent_static_block_ = static_cast<double>(num_static_block_) / |
70 (mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL); | 85 (mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL); |
71 num_noisy_block_ = 0; | 86 num_noisy_block_ = 0; |
72 num_static_block_ = 0; | 87 num_static_block_ = 0; |
73 } | 88 } |
74 // For the first frame just update the value with current noise_var_, | 89 // For the first frame just update the value with current noise_var_, |
75 // otherwise, use the averaging window. | 90 // otherwise, use the averaging window. |
76 if (noise_var_accum_ == 0) { | 91 if (noise_var_accum_ == 0) { |
77 noise_var_accum_ = noise_var_; | 92 noise_var_accum_ = noise_var_; |
78 } else { | 93 } else { |
79 noise_var_accum_ = (noise_var_accum_ * 15 + noise_var_) / 16; | 94 noise_var_accum_ = (noise_var_accum_ * 15 + noise_var_) / 16; |
80 } | 95 } |
81 #if DISPLAY | 96 #if DISPLAY |
82 printf("noise_var_accum_ = %.1f, noise_var_ = %d.\n", noise_var_accum_, | 97 if (cpu_type_) { |
83 noise_var_); | 98 printf("noise_var_accum_ = %.1f, noise_var_ = %d.\n", noise_var_accum_, |
| 99 noise_var_); |
| 100 } else { |
| 101 __android_log_print(ANDROID_LOG_DEBUG, "DISPLAY", |
| 102 "noise_var_accum_ = %.1f, noise_var_ = %d.\n", |
| 103 noise_var_accum_, noise_var_); |
| 104 } |
84 #endif | 105 #endif |
85 // Reset noise_var_ for the next frame. | 106 // Reset noise_var_ for the next frame. |
86 noise_var_ = 0; | 107 noise_var_ = 0; |
87 } | 108 } |
88 | 109 |
89 uint8_t NoiseEstimation::GetNoiseLevel() { | 110 uint8_t NoiseEstimation::GetNoiseLevel() { |
90 int noise_thr = cpu_type_ ? kNoiseThreshold : kNoiseThresholdNeon; | 111 int noise_thr = cpu_type_ ? kNoiseThreshold : kNoiseThresholdNeon; |
91 UpdateNoiseLevel(); | 112 UpdateNoiseLevel(); |
92 if (noise_var_accum_ > noise_thr) { | 113 if (noise_var_accum_ > noise_thr) { |
93 return 1; | 114 return 1; |
94 } | 115 } |
95 return 0; | 116 return 0; |
96 } | 117 } |
97 | 118 |
98 } // namespace webrtc | 119 } // namespace webrtc |
OLD | NEW |