diff options
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_noise_estimate.c | 23 | ||||
-rw-r--r-- | vp9/encoder/vp9_noise_estimate.h | 1 |
2 files changed, 19 insertions, 5 deletions
diff --git a/vp9/encoder/vp9_noise_estimate.c b/vp9/encoder/vp9_noise_estimate.c index ddf081c86..b41ffd0a3 100644 --- a/vp9/encoder/vp9_noise_estimate.c +++ b/vp9/encoder/vp9_noise_estimate.c @@ -36,6 +36,7 @@ void vp9_noise_estimate_init(NOISE_ESTIMATE *const ne, } else if (width * height >= 1280 * 720) { ne->thresh = 130; } + ne->num_frames_estimate = 20; } int enable_noise_estimation(VP9_COMP *const cpi) { @@ -88,10 +89,9 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { // Estimate of noise level every frame_period frames. int frame_period = 10; int thresh_consec_zeromv = 8; - unsigned int thresh_sum_diff = 128; + unsigned int thresh_sum_diff = 100; unsigned int thresh_sum_spatial = (200 * 200) << 8; unsigned int thresh_spatial_var = (32 * 32) << 8; - int num_frames_estimate = 20; int min_blocks_estimate = cm->mi_rows * cm->mi_cols >> 7; // Estimate is between current source and last source. YV12_BUFFER_CONFIG *last_source = cpi->Last_Source; @@ -135,6 +135,17 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { const int uv_width_shift = y_width_shift >> 1; const int uv_height_shift = y_height_shift >> 1; int mi_row, mi_col; + int num_low_motion = 0; + int frame_low_motion = 1; + for (mi_row = 0; mi_row < cm->mi_rows; mi_row++) { + for (mi_col = 0; mi_col < cm->mi_cols; mi_col++) { + int bl_index = mi_row * cm->mi_cols + mi_col; + if (cr->consec_zero_mv[bl_index] > thresh_consec_zeromv) + num_low_motion++; + } + } + if (num_low_motion < ((3 * cm->mi_rows * cm->mi_cols) >> 3)) + frame_low_motion = 0; for (mi_row = 0; mi_row < cm->mi_rows; mi_row++) { for (mi_col = 0; mi_col < cm->mi_cols; mi_col++) { // 16x16 blocks, 1/4 sample of frame. @@ -154,7 +165,8 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { const uint8_t vsource = src_v[uv_height_shift * src_uvstride + uv_width_shift]; int is_skin = vp9_skin_pixel(ysource, usource, vsource); - if (cr->consec_zero_mv[bl_index] > thresh_consec_zeromv && + if (frame_low_motion && + cr->consec_zero_mv[bl_index] > thresh_consec_zeromv && cr->consec_zero_mv[bl_index1] > thresh_consec_zeromv && cr->consec_zero_mv[bl_index2] > thresh_consec_zeromv && cr->consec_zero_mv[bl_index3] > thresh_consec_zeromv && @@ -202,10 +214,11 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { // Normalize. avg_est = avg_est / num_samples; // Update noise estimate. - ne->value = (int)((3 * ne->value + avg_est) >> 2); + ne->value = (int)((15 * ne->value + avg_est) >> 4); ne->count++; - if (ne->count == num_frames_estimate) { + if (ne->count == ne->num_frames_estimate) { // Reset counter and check noise level condition. + ne->num_frames_estimate = 30; ne->count = 0; if (ne->value > (ne->thresh << 1)) ne->level = kHigh; diff --git a/vp9/encoder/vp9_noise_estimate.h b/vp9/encoder/vp9_noise_estimate.h index b5dded9ef..0d22ef042 100644 --- a/vp9/encoder/vp9_noise_estimate.h +++ b/vp9/encoder/vp9_noise_estimate.h @@ -38,6 +38,7 @@ typedef struct noise_estimate { int count; int last_w; int last_h; + int num_frames_estimate; } NOISE_ESTIMATE; struct VP9_COMP; |